You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2012/06/05 23:45:57 UTC

svn commit: r1346615 - in /subversion/branches/inheritable-props/subversion/tests/cmdline: iprop_tests.py svntest/actions.py

Author: pburba
Date: Tue Jun  5 21:45:57 2012
New Revision: 1346615

URL: http://svn.apache.org/viewvc?rev=1346615&view=rev
Log:
On the inheritable-props branch: Add more tests.

* subversion/tests/cmdline/iprop_tests.py:
  (iprops_basic_working,
   iprops_basic_repos): Use the new  sbox.ospath() method rather than
   the old  os.path.join() method of creating WC paths.

  (iprops_switched_subtrees,
   iprops_pegged_wc_targets,
   iprops_pegged_url_targets): New.

  (test_list): Add new tests.

* subversion/tests/cmdline/svntest/actions.py
  (run_and_verify_inherited_prop_xml): Rename an argument to better reflect
   its purpose and add support for optional arguments.

Modified:
    subversion/branches/inheritable-props/subversion/tests/cmdline/iprop_tests.py
    subversion/branches/inheritable-props/subversion/tests/cmdline/svntest/actions.py

Modified: subversion/branches/inheritable-props/subversion/tests/cmdline/iprop_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/inheritable-props/subversion/tests/cmdline/iprop_tests.py?rev=1346615&r1=1346614&r2=1346615&view=diff
==============================================================================
--- subversion/branches/inheritable-props/subversion/tests/cmdline/iprop_tests.py (original)
+++ subversion/branches/inheritable-props/subversion/tests/cmdline/iprop_tests.py Tue Jun  5 21:45:57 2012
@@ -51,13 +51,13 @@ def iprops_basic_working(sbox):
   wc_dir = sbox.wc_dir
 
   # Paths of note.
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  D_path = os.path.join(wc_dir, 'A', 'D')
-  psi_path = os.path.join(wc_dir, 'A', 'D', 'H', 'psi')
-  iota_path = os.path.join(wc_dir, 'iota')
-  alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
-  G_path = os.path.join(wc_dir, 'A', 'D', 'G')
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
+  mu_path = sbox.ospath('A/mu')
+  D_path = sbox.ospath('A/D')
+  psi_path = sbox.ospath('A/D/H/psi')
+  iota_path = sbox.ospath('iota')
+  alpha_path = sbox.ospath('A/B/E/alpha')
+  G_path = sbox.ospath('A/D/G')
+  rho_path = sbox.ospath('A/D/G/rho')
 
   sbox.simple_propset('RootProp1', 'Root-Prop-Val1', '.')
   sbox.simple_propset('RootProp2', 'Root-Prop-Val2', '.')
@@ -175,8 +175,8 @@ def iprops_basic_repos(sbox):
   wc_dir = sbox.wc_dir
 
   # Paths of note.
-  D_path = os.path.join(wc_dir, 'A', 'D')
-  alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
+  D_path = sbox.ospath('A/D')
+  alpha_path = sbox.ospath('A/B/E/alpha')
 
   sbox.simple_propset('FileProp1', 'File-Prop-Val1', 'iota')
   sbox.simple_propset('FileProp2', 'File-Prop-Val2', 'A/D/H/psi')
@@ -296,6 +296,1114 @@ def iprops_basic_repos(sbox):
     sbox.repo_url + '/A/D/G/rho', expected_iprops, expected_explicit_props,
     'SomeProp')
 
+#----------------------------------------------------------------------
+# Property inheritance in a WC with switched subtrees.
+def iprops_switched_subtrees(sbox):
+  "inherited properties in switched subtrees"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  # Paths of note.
+  branch2_path        = sbox.ospath('branch2')
+  branch2_B_path      = sbox.ospath('branch2/B')
+  branch2_lambda_path = sbox.ospath('branch2/B/lambda')
+
+  # r2-3 - Create two branches
+  svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A',
+                       sbox.repo_url + '/branch1', '-m', 'Make branch1')
+
+  svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A',
+                       sbox.repo_url + '/branch2', '-m', 'Make branch2')
+  
+  # Create a root property and two branch properties
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+  sbox.simple_propset('Root-Prop-1', 'Root-Prop-Val1', '.')
+  sbox.simple_propset('Branch-Name', 'Feature #1', 'branch1')
+  sbox.simple_propset('Branch-Name', 'Feature #2', 'branch2')
+
+  # Switch a subtree of branch2 to branch1:
+  svntest.main.run_svn(None, 'switch', sbox.repo_url + '/branch1/B',
+                       branch2_B_path)
+
+  # Check for inherited props on branch2/B/lambda.  Since the prop changes
+  # made above have not been committed, there should be none.
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    branch2_B_path, expected_iprops, expected_explicit_props)
+
+ # r4 - Commit the prop changes made above.
+  svntest.main.run_svn(None, 'commit', '-m', 'Add some dir properties',
+                       wc_dir)
+
+  # Again check for inherited props on branch2/B/lambda.  And again there
+  # should be none because branch2/B is switched to ^/branch1/B@3.
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    branch2_lambda_path, expected_iprops, expected_explicit_props)
+
+  # Now update the WC, now branch2/B is switched to ^/branch1/B@4
+  # which does inherit properties from ^/branch1 and ^/.  The inherited
+  # properties cache should be updated to reflect this when asking what
+  # properties branch2/B/lambda inherits.
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+  expected_iprops = {
+    sbox.repo_url              : {'Root-Prop-1' : 'Root-Prop-Val1'},
+    sbox.repo_url + '/branch1' : {'Branch-Name' : 'Feature #1'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    branch2_lambda_path, expected_iprops, expected_explicit_props)
+
+  # Now update the WC back to r3, where there are no properties.  The
+  # inheritable properties cache for the WC-root at branch2/B should be
+  # cleared and no inheritable properties found for branch2/B/lambda.
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r3', wc_dir)
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    branch2_lambda_path, expected_iprops, expected_explicit_props)
+  # Update back to HEAD=r4 before continuing.
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+
+  # Now unswitch branch2/B and check branch2/B/lambda's inherited props.
+  # Now no iprop cache for branch2/B should exist and branch2/B/lambda
+  # should inherit from branch2 and '.'.
+  svntest.main.run_svn(None, 'switch', sbox.repo_url + '/branch2/B',
+                       branch2_B_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+  expected_iprops = {
+    ### Working copy parents! ###
+    wc_dir       : {'Root-Prop-1' : 'Root-Prop-Val1'},
+    branch2_path : {'Branch-Name' : 'Feature #2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    branch2_lambda_path, expected_iprops, expected_explicit_props)
+
+  # Now switch the root of the WC to ^/branch2 and check the inherited
+  # properties on B/lambda.  It should inherit the explicit property
+  # on the WC path '.' (i.e. ^/branch2) and the property on the root
+  # of the repos via the inherited props cache.
+  svntest.main.run_svn(None, 'switch', '--ignore-ancestry',
+                       sbox.repo_url + '/branch2', wc_dir)
+  expected_iprops = {
+    ### Root if a repos parent ###
+    sbox.repo_url : {'Root-Prop-1' : 'Root-Prop-Val1'},
+    ### Branch root is a working copy parent ###
+    wc_dir        : {'Branch-Name' : 'Feature #2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.ospath('B/lambda'),
+    expected_iprops, expected_explicit_props)
+
+#----------------------------------------------------------------------
+# Property inheritance with pegged wc and repos targets.
+def iprops_pegged_wc_targets(sbox):
+  "iprops of pegged targets at operative revs"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  # Paths of note.
+  C_path = sbox.ospath('A/C')
+  D_path = sbox.ospath('A/D')
+  G_path = sbox.ospath('A/D/G')
+  alpha_path = sbox.ospath('A/B/E/alpha')
+  replaced_alpha_path = sbox.ospath('A/D/G/E/alpha')
+
+  # r2 - Set some root properties and a property on A/D, and make an edit
+  # to A/B/E/alpha.
+  sbox.simple_propset('RootProp1', 'Root-Prop-Val-1-set-in-r2', '.')
+  sbox.simple_propset('RootProp2', 'Root-Prop-Val-2-set-in-r2', '.')
+  sbox.simple_propset('D-Prop', 'D-Prop-Val-set-in-r2', 'A/D')
+  svntest.main.file_write(alpha_path, "Edit in r2.\n")  
+  svntest.main.run_svn(None, 'commit', '-m', 'Add some properties',
+                       wc_dir)
+
+  # r3 - Change all of the properties.
+  sbox.simple_propset('RootProp1', 'Root-Prop-Val-1-set-in-r3', '.')
+  sbox.simple_propset('RootProp2', 'Root-Prop-Val-2-set-in-r3', '.')
+  sbox.simple_propset('D-Prop', 'D-Prop-Val-set-in-r3', 'A/D')
+  svntest.main.run_svn(None, 'commit', '-m', 'Modify some properties',
+                       wc_dir)
+
+  # Set some working properties.
+  sbox.simple_propset('RootProp1', 'Root-Prop-Val-1-WORKING', '.')
+  sbox.simple_propset('RootProp2', 'Root-Prop-Val-2-WORKING', '.')
+  sbox.simple_propset('D-Prop', 'D-Prop-Val-WORKING', 'A/D')
+
+  ### Peg Revision = HEAD
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | HEAD         | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'HEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | HEAD         | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'HEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | HEAD         | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r2'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'HEAD', '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | HEAD         | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'HEAD',
+    '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | HEAD         | COMMITTED
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'HEAD',
+    '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | HEAD         | COMMITTED
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'HEAD',
+    '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | HEAD         | PREV
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r2'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'HEAD',
+    '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | HEAD         | PREV
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'HEAD',
+    '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | HEAD         | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'HEAD',
+    '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | HEAD         | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'HEAD',
+    '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | HEAD         | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'HEAD',
+    '-rHEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | HEAD         | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'HEAD',
+    '-rHEAD')
+
+  ### Peg Revision = Unspecified
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | unspecified  | unspecified
+  expected_iprops = {
+    wc_dir : {'RootProp1' : 'Root-Prop-Val-1-WORKING',
+              'RootProp2' : 'Root-Prop-Val-2-WORKING'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-WORKING'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props)
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | unspecified  | unspecified
+  expected_iprops = {
+    wc_dir : {'RootProp1' : 'Root-Prop-Val-1-WORKING'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | unspecified  | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r2'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, None, '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | unspecified  | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', None,
+    '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | unspecified  | revision=COMMITTED (i.e. r3)
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, None,
+    '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | unspecified  | COMMITTED
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', None,
+    '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | unspecified  | revision=PREV (i.e. r2)
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r2'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, None, '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | unspecified  | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', None,
+    '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | unspecified  | revision=BASE (i.e. r3)
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, None, '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | unspecified  | revision=BASE (i.e. r3)
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', None,
+    '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | unspecified  | revision=HEAD (i.e. r3)
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, None, '-rHEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | unspecified  | revision=HEAD (i.e. r3)
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', None,
+    '-rHEAD')
+
+  ### Peg Revision = rN
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | revision=1   | unspecified
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, '1')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | revision=1   | unspecified
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', '1')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | revision=1   | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r2'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, '1', '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | revision=1   | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', '1', '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | revision=1   | COMMITTED
+  # The last committed revision for A/D is r3.
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, '1',
+    '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | revision=1   | COMMITTED
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', '1',
+    '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | revision=3   | PREV
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r2'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, '3', '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | revision=3   | PREV
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', '3',
+    '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | revision=1   | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, '1', '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | revision=1   | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', '1',
+    '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | revision=2   | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, '2', '-rHEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | revision=1   | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', '1',
+    '-rHEAD')
+
+  ### Peg Revision = PREV
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | PREV         | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r2'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'PREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | PREV         | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'PREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | PREV         | revision=3
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'PREV', '-r3')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | PREV   |       revision=3
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'PREV',
+    '-r3')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | PREV         | COMMITTED
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'PREV',
+    '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | PREV         | COMMITTED
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'PREV',
+    '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | PREV         | PREV
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r2'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'PREV', '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | PREV         | PREV
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'PREV',
+    '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | PREV         | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'PREV', '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | PREV         | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'PREV',
+    '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | PREV         | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {'D-Prop' : 'D-Prop-Val-set-in-r3'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, None, 'PREV', '-rHEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | PREV         | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    D_path, expected_iprops, expected_explicit_props, 'RootProp1', 'PREV',
+    '-rHEAD')
+
+  ### Peg Revision = BASE
+
+  # Replace A/D/G with a copy of ^/A/B.
+  # Check inherited props on base of A/D/G/E/alpha.
+  # Inherited props should always come from the repository parent of
+  # ^/A/B/E/alpha and so should not include the property (working or
+  # otherwise) on A/D.
+  svntest.actions.run_and_verify_svn(None, None, [], 'delete', G_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'copy',
+                                    sbox.repo_url + '/A/B', G_path)
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | BASE         | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'BASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | BASE         | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'BASE')
+
+# Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | BASE       | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'BASE', '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | BASE         | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'BASE', '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | BASE         | COMMITTED
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'BASE', '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | BASE         | revision=2
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'BASE', '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | BASE         | COMMITTED
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  # so PREV=r1, but there are no properties at all in r1.
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'BASE', '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | BASE         | COMMITTED
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  # so PREV=r1, but there are no properties at all in r1.
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'BASE', '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | BASE         | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'BASE', '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | BASE         | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'BASE', '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | BASE         | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'BASE', '-rHEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | BASE         | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'BASE', '-rHEAD')
+
+  ### Peg Revision = COMMITTED
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | COMMITTED    | unspecified
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'COMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | COMMITTED    | unspecified
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'COMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | COMMITTED    | revision=3
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'COMMITTED', '-r3')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | COMMITTED    | revision=3
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'COMMITTED', '-r3')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | COMMITTED    | COMMITTED
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'COMMITTED', '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | COMMITTED    | COMMITTED
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'COMMITTED', '-rCOMMITTED')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | COMMITTED    | PREV
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  # so PREV=r1, but there are no properties at all in r1.
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'COMMITTED', '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | COMMITTED    | PREV
+  # The most recent change on the copy source, ^/A/B/E/alpha is r2
+  # so PREV=r1, but there are no properties at all in r1.
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'COMMITTED', '-rPREV')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | COMMITTED    | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'COMMITTED', '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | COMMITTED    | BASE
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'COMMITTED', '-rBASE')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | WC     | COMMITTED    | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'COMMITTED', '-rHEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | WC     | COMMITTED    | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3'}}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'COMMITTED', '-rHEAD')
+
+  # Revert the replacement with history of A/D/G and once again
+  # replace A/D/G, but this time without history (using and export
+  # of A/B.
+  svntest.actions.run_and_verify_svn(None, None, [], 'revert', G_path, '-R')
+  svntest.actions.run_and_verify_svn(None, None, [], 'delete', G_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'export',
+                                     sbox.repo_url + '/A/B', G_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'add', G_path)
+  # Set a working prop on a file within the replaced tree, we should *never*
+  # see this property if asking about the
+  # file@[HEAD | PREV | COMMITTED | BASE]
+  sbox.simple_propset('FileProp', 'File-Prop-WORKING-NO-BASE',
+                      'A/D/G/E/alpha')
+
+  # There is no HEAD, PREV, COMMITTED, or BASE revs for A/D/G/E/alpha in this
+  # case # so be sure requests for such error out or return nothing as per the
+  # existing behavior for proplist and propget sans the --show-inherited-props
+  # option.
+  #
+  # proplist/propget WC-PATH@HEAD
+  svntest.actions.run_and_verify_svn(
+    None, None,
+    ".*Unknown node kind for '" + sbox.repo_url + "/A/D/G/E/alpha'\n",
+    'pl', '-v', '--show-inherited-props', replaced_alpha_path + '@HEAD')
+  svntest.actions.run_and_verify_svn(
+    None, None,
+    ".*'" + sbox.repo_url + "/A/D/G/E/alpha' does not exist in revision 3\n",
+    'pg', 'RootProp1', '-v', '--show-inherited-props',
+    replaced_alpha_path + '@HEAD')
+  # proplist/propget WC-PATH@PREV
+  svntest.actions.run_and_verify_svn(
+    None, None,
+    ".*Path '.*alpha' has no committed revision\n",
+    'pl', '-v', '--show-inherited-props', replaced_alpha_path + '@PREV')
+  svntest.actions.run_and_verify_svn(
+    None, None,
+    ".*Path '.*alpha' has no committed revision\n",
+    'pg', 'RootProp1', '-v', '--show-inherited-props', replaced_alpha_path + '@PREV')
+  # proplist/propget WC-PATH@COMMITTED
+  expected_iprops = {}
+  expected_explicit_props = {}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'COMMITTED')
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'COMMITTED')
+  # proplist/propget WC-PATH@BASE
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props, None,
+    'BASE')
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    replaced_alpha_path, expected_iprops, expected_explicit_props,
+    'RootProp1', 'BASE')
+
+#----------------------------------------------------------------------
+# Property inheritance with pegged repos targets at operative revs.
+def iprops_pegged_url_targets(sbox):
+  "iprops of pegged targets at operative revs"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  # Paths of note.
+  #C_path = sbox.ospath('A/C')
+  #D_path = sbox.ospath('A/D')
+  #G_path = sbox.ospath('A/D/G')
+  alpha_path = sbox.ospath('A/B/E/alpha')
+  #replaced_alpha_path = sbox.ospath('A/D/G/E/alpha')
+
+  # r2 - Set some root properties and some properties on A/D.
+  sbox.simple_propset('RootProp1', 'Root-Prop-Val-1-set-in-r2', '.')
+  sbox.simple_propset('RootProp2', 'Root-Prop-Val-2-set-in-r2', '.')
+  sbox.simple_propset('DirProp', 'Dir-Prop-Val-set-in-r2', '.')
+  sbox.simple_propset('DirProp', 'Dir-Prop-Val-set-in-r2-on-D', 'A/D')
+  sbox.simple_propset('D-Prop', 'D-Prop-Val-set-in-r2', 'A/D')
+  svntest.main.run_svn(None, 'commit', '-m', 'Add some properties',
+                       wc_dir)
+
+  # r3 - Make another change to all of the properties set in r2.
+  sbox.simple_propset('RootProp1', 'Root-Prop-Val-1-set-in-r3', '.')
+  sbox.simple_propset('RootProp2', 'Root-Prop-Val-2-set-in-r3', '.')
+  sbox.simple_propset('DirProp', 'Dir-Prop-Val-set-in-r3', '.')
+  sbox.simple_propset('DirProp', 'Dir-Prop-Val-set-in-r3-on-D', 'A/D')
+  sbox.simple_propset('D-Prop', 'D-Prop-Val-set-in-r3', 'A/D')
+  svntest.main.run_svn(None, 'commit', '-m', 'Modify some properties',
+                       wc_dir)
+
+  ### Peg Revision = Unspecified
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | URL    | unspecified  | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3',
+                     'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'D-Prop'  : 'D-Prop-Val-set-in-r3',
+                             'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props)
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | URL    | unspecified  | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    'DirProp')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | URL    | unspecified  | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2',
+                     'DirProp'   : 'Dir-Prop-Val-set-in-r2'}}
+  expected_explicit_props = {'D-Prop'  : 'D-Prop-Val-set-in-r2',
+                             'DirProp' : 'Dir-Prop-Val-set-in-r2-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props, None,
+    None, '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | URL    | unspecified  | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'DirProp'   : 'Dir-Prop-Val-set-in-r2'}}
+  expected_explicit_props = {'DirProp' : 'Dir-Prop-Val-set-in-r2-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    'DirProp', None, '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | URL    | unspecified  | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3',
+                     'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'D-Prop'  : 'D-Prop-Val-set-in-r3',
+                             'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    None, None, '-rHEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | URL    | unspecified  | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    'DirProp', None, '-rHEAD')
+
+  ### Peg Revision = rN
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | URL    | revision=2   | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2',
+                     'DirProp'   : 'Dir-Prop-Val-set-in-r2'}}
+  expected_explicit_props = {'D-Prop'  : 'D-Prop-Val-set-in-r2',
+                             'DirProp' : 'Dir-Prop-Val-set-in-r2-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    None, '2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | URL    | revision=2   | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'DirProp'   : 'Dir-Prop-Val-set-in-r2'}}
+  expected_explicit_props = {'DirProp' : 'Dir-Prop-Val-set-in-r2-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    'DirProp', '2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | URL    | revision=2   | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2',
+                     'DirProp'   : 'Dir-Prop-Val-set-in-r2'}}
+  expected_explicit_props = {'D-Prop'  : 'D-Prop-Val-set-in-r2',
+                             'DirProp' : 'Dir-Prop-Val-set-in-r2-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props, None,
+    '2', '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | URL    | revision=2   | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'DirProp'   : 'Dir-Prop-Val-set-in-r2'}}
+  expected_explicit_props = {'DirProp' : 'Dir-Prop-Val-set-in-r2-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    'DirProp', '2', '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | URL    | revision=2   | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3',
+                     'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'D-Prop'  : 'D-Prop-Val-set-in-r3',
+                             'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    None, '2', '-rHEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | URL    | revision=2   | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    'DirProp', '2', '-rHEAD')
+
+  ### Peg Revision = HEAD
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | URL    | HEAD         | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3',
+                     'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'D-Prop'  : 'D-Prop-Val-set-in-r3',
+                             'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    None, 'HEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | URL    | HEAD         | unspecified
+  expected_iprops = {
+    sbox.repo_url : {'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    'DirProp', 'HEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | URL    | HEAD         | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r2',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r2',
+                     'DirProp'   : 'Dir-Prop-Val-set-in-r2'}}
+  expected_explicit_props = {'D-Prop'  : 'D-Prop-Val-set-in-r2',
+                             'DirProp' : 'Dir-Prop-Val-set-in-r2-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props, None,
+    'HEAD', '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | URL    | HEAD         | revision=2
+  expected_iprops = {
+    sbox.repo_url : {'DirProp'   : 'Dir-Prop-Val-set-in-r2'}}
+  expected_explicit_props = {'DirProp' : 'Dir-Prop-Val-set-in-r2-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    'DirProp', 'HEAD', '-r2')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # proplist  | URL    | HEAD         | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'RootProp1' : 'Root-Prop-Val-1-set-in-r3',
+                     'RootProp2' : 'Root-Prop-Val-2-set-in-r3',
+                     'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'D-Prop'  : 'D-Prop-Val-set-in-r3',
+                             'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    None, 'HEAD', '-rHEAD')
+
+  # Operation | Target | Peg Revision | Operative Revision
+  # propget   | URL    | HEAD         | HEAD
+  expected_iprops = {
+    sbox.repo_url : {'DirProp'   : 'Dir-Prop-Val-set-in-r3'}}
+  expected_explicit_props = {'DirProp' : 'Dir-Prop-Val-set-in-r3-on-D'}
+  svntest.actions.run_and_verify_inherited_prop_xml(
+    sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props,
+    'DirProp', 'HEAD', '-rHEAD')
+
 ########################################################################
 # Run the tests
 
@@ -303,6 +1411,9 @@ def iprops_basic_repos(sbox):
 test_list = [ None,
               iprops_basic_working,
               iprops_basic_repos,
+              iprops_switched_subtrees,
+              iprops_pegged_wc_targets,
+              iprops_pegged_url_targets,
             ]
 
 if __name__ == '__main__':

Modified: subversion/branches/inheritable-props/subversion/tests/cmdline/svntest/actions.py
URL: http://svn.apache.org/viewvc/subversion/branches/inheritable-props/subversion/tests/cmdline/svntest/actions.py?rev=1346615&r1=1346614&r2=1346615&view=diff
==============================================================================
--- subversion/branches/inheritable-props/subversion/tests/cmdline/svntest/actions.py (original)
+++ subversion/branches/inheritable-props/subversion/tests/cmdline/svntest/actions.py Tue Jun  5 21:45:57 2012
@@ -1577,12 +1577,13 @@ def run_and_verify_inherited_prop_xml(pa
                                       expected_inherited_props,
                                       expected_explicit_props,
                                       propname=None,
-                                      revision=None):
+                                      peg_rev=None,
+                                      *args):
   """If PROPNAME is None, then call run_and_verify_svn with proplist -v --xml
   --show-inherited-props on PATH_OR_URL, otherwise call run_and_verify_svn
   with propget PROPNAME --xml --show-inherited-props.
 
-  PATH_OR_URL is pegged at REVISION if the latter is not None.  If REVISION
+  PATH_OR_URL is pegged at PEG_REV if the latter is not None.  If PEG_REV
   is none, then PATH_OR_URL is pegged at HEAD if a url.
 
   EXPECTED_INHERITED_PROPS is a (possibly empty) dict mapping working copy
@@ -1593,20 +1594,20 @@ def run_and_verify_inherited_prop_xml(pa
   EXPECTED_EXPLICIT_PROPS don't match the results of proplist/propget.
   """
 
-  if revision is None:
+  if peg_rev is None:
     if sandbox.is_url(path_or_url):
       path_or_url = path_or_url + '@HEAD'
   else:
-    path_or_url = path_or_url + '@' + str(revision)
+    path_or_url = path_or_url + '@' + str(peg_rev)
 
   if (propname):
     exit_code, output, errput = svntest.actions.run_and_verify_svn(
       None, None, [], 'propget', propname, '--xml',
-      '--show-inherited-props', path_or_url)
+      '--show-inherited-props', path_or_url, *args)
   else:
     exit_code, output, errput = svntest.actions.run_and_verify_svn(
       None, None, [], 'proplist', '-v', '--xml', '--show-inherited-props',
-      path_or_url)
+      path_or_url, *args)
 
   if len(errput) > 0:
     raise Failure