diff options
Diffstat (limited to 'subversion/tests/cmdline/iprop_tests.py')
-rwxr-xr-x | subversion/tests/cmdline/iprop_tests.py | 1692 |
1 files changed, 1692 insertions, 0 deletions
diff --git a/subversion/tests/cmdline/iprop_tests.py b/subversion/tests/cmdline/iprop_tests.py new file mode 100755 index 0000000..cc57e59 --- /dev/null +++ b/subversion/tests/cmdline/iprop_tests.py @@ -0,0 +1,1692 @@ +#!/usr/bin/env python +# +# iprop_tests.py: testing versioned inherited properties +# +# Subversion is a tool for revision control. +# See http://subversion.apache.org for more information. +# +# ==================================================================== +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +###################################################################### + +# General modules +import os + +# Our testing module +import svntest + +# (abbreviation) +Skip = svntest.testcase.Skip_deco +SkipUnless = svntest.testcase.SkipUnless_deco +XFail = svntest.testcase.XFail_deco +Issues = svntest.testcase.Issues_deco +Issue = svntest.testcase.Issue_deco +Wimp = svntest.testcase.Wimp_deco +Item = svntest.wc.StateItem + +###################################################################### +# Tests + +#---------------------------------------------------------------------- +# Working property inheritance, uniform revision WC. +def iprops_basic_working(sbox): + "basic inherited working properties" + + sbox.build() + wc_dir = sbox.wc_dir + + # Paths of note. + 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', '.') + sbox.simple_propset('DirProp2', 'Dir-Prop-Val-Root', '.') + sbox.simple_propset('FileProp1', 'File-Prop-Val1', 'iota') + sbox.simple_propset('FileProp2', 'File-Prop-Val2', 'A/D/H/psi') + sbox.simple_propset('DirProp1', 'Dir-Prop-Val1', 'A/D') + sbox.simple_propset('DirProp2', 'Dir-Prop-Val2', 'A/D') + sbox.simple_propset('DirProp3', 'Dir-Prop-Val3', 'A/D') + sbox.simple_propset('SomeProp', 'Some-Prop-Val1', 'A/D/G') + sbox.simple_propset('SomeProp', 'Some-Prop-Val2', 'A/D/G/rho') + + ### Proplist Directory Targets + + # Proplist directory target with only explicit props. + expected_iprops = {} + expected_explicit_props = {'DirProp2' : 'Dir-Prop-Val-Root', + 'RootProp1' : 'Root-Prop-Val1', + 'RootProp2' : 'Root-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + wc_dir, expected_iprops, expected_explicit_props) + + # Proplist directory target with only inherited props. + expected_iprops = {wc_dir : {'DirProp2' : 'Dir-Prop-Val-Root', + 'RootProp1' : 'Root-Prop-Val1', + 'RootProp2' : 'Root-Prop-Val2'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + alpha_path, expected_iprops, expected_explicit_props) + + # Proplist directory target with inherited and explicit props. + expected_iprops = {wc_dir : {'RootProp1' : 'Root-Prop-Val1', + 'RootProp2' : 'Root-Prop-Val2', + 'DirProp2' : 'Dir-Prop-Val-Root'}} + expected_explicit_props = {'DirProp1' : 'Dir-Prop-Val1', + 'DirProp2' : 'Dir-Prop-Val2', + 'DirProp3' : 'Dir-Prop-Val3'} + svntest.actions.run_and_verify_inherited_prop_xml( + D_path, expected_iprops, expected_explicit_props) + + ### Propget Directory Targets + + # Propget directory target with only explicit props. + expected_iprops = {} + expected_explicit_props = {'RootProp2' : 'Root-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + wc_dir, expected_iprops, expected_explicit_props, 'RootProp2') + + # Propget directory target with only inherited props. + expected_iprops = {wc_dir : {'RootProp2': 'Root-Prop-Val2'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + alpha_path, expected_iprops, expected_explicit_props, 'RootProp2') + + # Propget directory target with inherited and explicit props. + expected_iprops = {wc_dir : {'DirProp2' : 'Dir-Prop-Val-Root',}} + expected_explicit_props = {'DirProp2' : 'Dir-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + D_path, expected_iprops, expected_explicit_props, 'DirProp2') + + ### Propget File Targets + + # Propget file target with only explicit props. + expected_iprops = {} + expected_explicit_props = {'FileProp1' : 'File-Prop-Val1'} + svntest.actions.run_and_verify_inherited_prop_xml( + iota_path, expected_iprops, expected_explicit_props, 'FileProp1') + + # Propget file target with only inherited props. + expected_iprops = {wc_dir : {'RootProp2': 'Root-Prop-Val2'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + alpha_path, expected_iprops, expected_explicit_props, 'RootProp2') + + # Propget file target with inherited and explicit props. + expected_iprops = {G_path : {'SomeProp' : 'Some-Prop-Val1',}} + expected_explicit_props = {'SomeProp' : 'Some-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + rho_path, expected_iprops, expected_explicit_props, 'SomeProp') + + ### Proplist File Targets + + # Proplist file target with only inherited props. + expected_iprops = {wc_dir : {'DirProp2' : 'Dir-Prop-Val-Root', + 'RootProp1' : 'Root-Prop-Val1', + 'RootProp2' : 'Root-Prop-Val2'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + mu_path, expected_iprops, expected_explicit_props) + + # Proplist file target with inherited and explicit props. + expected_iprops = {wc_dir : {'RootProp1' : 'Root-Prop-Val1', + 'RootProp2' : 'Root-Prop-Val2', + 'DirProp2' : 'Dir-Prop-Val-Root'}, + D_path : {'DirProp1' : 'Dir-Prop-Val1', + 'DirProp2' : 'Dir-Prop-Val2', + 'DirProp3' : 'Dir-Prop-Val3'}} + expected_explicit_props = {'FileProp2' : 'File-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + psi_path, expected_iprops, expected_explicit_props) + + # Proplist file target with only explicit props. + svntest.actions.run_and_verify_svn(None, None, [], 'revert', wc_dir) + expected_iprops = {} + expected_explicit_props = {'FileProp1' : 'File-Prop-Val1'} + svntest.actions.run_and_verify_inherited_prop_xml( + iota_path, expected_iprops, expected_explicit_props) + +#---------------------------------------------------------------------- +# Property inheritance with repository targets. +def iprops_basic_repos(sbox): + "basic inherited repository properties" + + sbox.build() + wc_dir = sbox.wc_dir + + # Paths of note. + 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') + sbox.simple_propset('SomeProp', 'Some-Prop-Val2', 'A/D/G/rho') + svntest.main.run_svn(None, 'commit', '-m', 'Add some file properties', + wc_dir) + + svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir) + sbox.simple_propset('RootProp1', 'Root-Prop-Val1', '.') + sbox.simple_propset('RootProp2', 'Root-Prop-Val2', '.') + sbox.simple_propset('DirProp2', 'Dir-Prop-Val-Root', '.') + sbox.simple_propset('DirProp1', 'Dir-Prop-Val1', 'A/D') + sbox.simple_propset('DirProp2', 'Dir-Prop-Val2', 'A/D') + sbox.simple_propset('DirProp3', 'Dir-Prop-Val3', 'A/D') + sbox.simple_propset('SomeProp', 'Some-Prop-Val1', 'A/D/G') + svntest.main.run_svn(None, 'commit', '-m', 'Add some dir properties', + wc_dir) + + ### Proplist Directory Targets + + # Proplist directory target with only explicit props. + expected_iprops = {} + expected_explicit_props = {'DirProp2' : 'Dir-Prop-Val-Root', + 'RootProp1' : 'Root-Prop-Val1', + 'RootProp2' : 'Root-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url, expected_iprops, expected_explicit_props) + + # Proplist directory target with only inherited props. + expected_iprops = {sbox.repo_url : {'DirProp2' : 'Dir-Prop-Val-Root', + 'RootProp1' : 'Root-Prop-Val1', + 'RootProp2' : 'Root-Prop-Val2'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url + '/A/B/E/alpha', expected_iprops, expected_explicit_props) + + # Proplist directory target with inherited and explicit props. + expected_iprops = {sbox.repo_url : {'RootProp1' : 'Root-Prop-Val1', + 'RootProp2' : 'Root-Prop-Val2', + 'DirProp2' : 'Dir-Prop-Val-Root'}} + expected_explicit_props = {'DirProp1' : 'Dir-Prop-Val1', + 'DirProp2' : 'Dir-Prop-Val2', + 'DirProp3' : 'Dir-Prop-Val3'} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props) + + ### Propget Directory Targets + + # Propget directory target with only explicit props. + expected_iprops = {} + expected_explicit_props = {'RootProp2' : 'Root-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url, expected_iprops, expected_explicit_props, 'RootProp2') + + # Propget directory target with only inherited props. + expected_iprops = {sbox.repo_url : {'RootProp2': 'Root-Prop-Val2'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url + '/A/B/E/alpha', expected_iprops, expected_explicit_props, + 'RootProp2') + + # Propget directory target with inherited and explicit props. + expected_iprops = {sbox.repo_url : {'DirProp2' : 'Dir-Prop-Val-Root',}} + expected_explicit_props = {'DirProp2' : 'Dir-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url + '/A/D', expected_iprops, expected_explicit_props, + 'DirProp2') + + ### Proplist File Targets + + # Proplist file target with only explicit props. + expected_iprops = {} + expected_explicit_props = {'FileProp1' : 'File-Prop-Val1'} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url + '/iota', expected_iprops, expected_explicit_props, + 'FileProp1', 2) + + # Proplist file target with only inherited props. + expected_iprops = {sbox.repo_url : {'RootProp1' : 'Root-Prop-Val1'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url + '/A/mu', expected_iprops, expected_explicit_props, + 'RootProp1') + + # Proplist file target with inherited and explicit props. + expected_iprops = {sbox.repo_url : {'RootProp1' : 'Root-Prop-Val1', + 'RootProp2' : 'Root-Prop-Val2', + 'DirProp2' : 'Dir-Prop-Val-Root'}, + sbox.repo_url + '/A/D' : {'DirProp1' : 'Dir-Prop-Val1', + 'DirProp2' : 'Dir-Prop-Val2', + 'DirProp3' : 'Dir-Prop-Val3'}} + expected_explicit_props = {'FileProp2' : 'File-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url + '/A/D/H/psi', expected_iprops, expected_explicit_props) + + ### Propget File Targets + + # Propget file target with only explicit props. + expected_iprops = {} + expected_explicit_props = {'FileProp1' : 'File-Prop-Val1'} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url + '/iota', expected_iprops, expected_explicit_props, + 'FileProp1', 2) + + # Propget file target with only inherited props. + expected_iprops = {sbox.repo_url : {'RootProp2': 'Root-Prop-Val2'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.repo_url + '/A/B/E/alpha', expected_iprops, expected_explicit_props, + 'RootProp2') + + # Propget file target with inherited and explicit props. + expected_iprops = {sbox.repo_url + '/A/D/G' : { + 'SomeProp' : 'Some-Prop-Val1',}} + expected_explicit_props = {'SomeProp' : 'Some-Prop-Val2'} + svntest.actions.run_and_verify_inherited_prop_xml( + 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) + + # Check that switched files have properties cached too. + # Switch the root of the WC to ^/A, then switch mu to ^/branch1/mu. + svntest.main.run_svn(None, 'switch', sbox.repo_url + '/A', wc_dir) + svntest.main.run_svn(None, 'switch', sbox.repo_url + '/branch1/mu', + sbox.ospath('mu')) + 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( + sbox.ospath('mu'), + expected_iprops, expected_explicit_props) + +#---------------------------------------------------------------------- +# Property inheritance with pegged wc and repos targets. +def iprops_pegged_wc_targets(sbox): + "iprops of pegged wc 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 url targets at operative revs" + + sbox.build() + wc_dir = sbox.wc_dir + + # 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') + +#---------------------------------------------------------------------- +# Inherited property caching during shallow updates. +def iprops_shallow_operative_depths(sbox): + "iprop caching works with shallow updates" + + sbox.build() + wc_dir = sbox.wc_dir + + # r2 - Create a branch.. + svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A', + sbox.repo_url + '/branch1', '-m', 'Make branch1') + svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir) + + # r3 - Create a root property and some branch properties + sbox.simple_propset('Root-Prop-1', 'Root-Prop-Val1', '.') + sbox.simple_propset('Branch-Name', 'Feature #1', 'branch1') + sbox.simple_propset('Branch-Name', 'Trunk', 'A') + svntest.main.run_svn(None, 'commit', '-m', 'Add some properties', + wc_dir) + + # r4 - Change the root and a branch properties added in r3. + sbox.simple_propset('Root-Prop-1', 'Root-Prop-Val1.1', '.') + sbox.simple_propset('Branch-Name', 'Feature No. 1', 'branch1') + sbox.simple_propset('Branch-Name', 'Trunk Branch', 'A') + svntest.main.run_svn(None, 'commit', '-m', 'Change some properties', + wc_dir) + + svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir) + + # Switch the WC to ^/branch1: + svntest.main.run_svn(None, 'switch', '--ignore-ancestry', + sbox.repo_url + '/branch1', wc_dir) + # Switch the B to ^/A/B: + svntest.main.run_svn(None, 'switch', sbox.repo_url + '/A/B', + sbox.ospath('B')) + # Switch the mu to ^/A/mu: + svntest.main.run_svn(None, 'switch', sbox.repo_url + '/A/mu', + sbox.ospath('mu')) + # Update the whole WC back to r3. + svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r3', wc_dir) + + # Check the inherited props on B/E within the switched subtree + # and the switched file mu. The props should all be inherited + # from repository locations and reflect the values at r3. + expected_iprops = { + sbox.repo_url : {'Root-Prop-1' : 'Root-Prop-Val1'}, + sbox.repo_url + '/A' : {'Branch-Name' : 'Trunk'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('B/E'), expected_iprops, expected_explicit_props) + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('mu'), expected_iprops, expected_explicit_props) + + # Update only the root of the WC (to HEAD=r4) using a shallow update. + # Again check the inherited props on B/E. This shouldn't affect the + # switched subtree at all, the props it inherits should still reflect + # the values at r3. + svntest.actions.run_and_verify_svn(None, None, [], 'up', + '--depth=empty', wc_dir) + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('B/E'), expected_iprops, expected_explicit_props) + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('mu'), expected_iprops, expected_explicit_props) + + # Update the root of the WC (to HEAD=r4) at depth=files. B/E should + # still inherit vales from r3, but mu should now inherit props from r4. + svntest.actions.run_and_verify_svn(None, None, [], 'up', + '--depth=files', wc_dir) + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('B/E'), expected_iprops, expected_explicit_props) + expected_iprops = { + sbox.repo_url : {'Root-Prop-1' : 'Root-Prop-Val1.1'}, + sbox.repo_url + '/A' : {'Branch-Name' : 'Trunk Branch'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('mu'), expected_iprops, expected_explicit_props) + + # Update the root of the WC (to HEAD=r4) at depth=immediates. Now both B/E + # and mu inherit props from r4. + svntest.actions.run_and_verify_svn(None, None, [], 'up', + '--depth=immediates', wc_dir) + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('B/E'), expected_iprops, expected_explicit_props) + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('mu'), expected_iprops, expected_explicit_props) + +#---------------------------------------------------------------------- +# Inherited property caching by directory externals. +def iprops_with_directory_externals(sbox): + "iprop caching works with directory externals" + + sbox.build() + wc_dir = sbox.wc_dir + + # Create a second repository with the original greek tree + repo_dir = sbox.repo_dir + other_repo_dir, other_repo_url = sbox.add_repo_path("other") + other_wc_dir = sbox.add_wc_path("other") + svntest.main.copy_repos(repo_dir, other_repo_dir, 1, 1) + svntest.actions.run_and_verify_svn(None, None, [], 'co', other_repo_url, + other_wc_dir) + + # Create a root property on the first WC. + sbox.simple_propset('Prime-Root-Prop', 'Root-Prop-Val1', '.') + svntest.main.run_svn(None, 'commit', '-m', 'Add a root property', + wc_dir) + + # Create a root property on the "other" WC. + svntest.actions.run_and_verify_svn(None, None, [], 'ps', 'Other-Root-Prop', + 'Root-Prop-Val-from-other', other_wc_dir) + svntest.main.run_svn(None, 'commit', '-m', 'Add a root property', + other_wc_dir) + + # Switch the root of the first WC to a repository non-root, it will + # now have cached iprops from the first repos. + svntest.main.run_svn(None, 'switch', sbox.repo_url + '/A/B', + wc_dir, '--ignore-ancestry') + + # Create an external in the first WC that points to a location in the + # "other" WC. + sbox.simple_propset('svn:externals', + other_repo_url + '/A/D/G X-Other-Repos', + 'E') + svntest.actions.run_and_verify_svn(None, None, [], 'ci', + '-m', 'Add external point to other WC', + wc_dir) + svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir) + + # Create an external in the first WC that points to a location in the + # same WC. + sbox.simple_propset('svn:externals', + sbox.repo_url + '/A/D/H X-Same-Repos', + 'F') + svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m', + 'Add external pointing to same repos', + wc_dir) + svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir) + + # Check the properties inherited by the external from the same repository. + # It should inherit the props from the root of the same repository. + expected_iprops = { + sbox.repo_url : {'Prime-Root-Prop' : 'Root-Prop-Val1'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('F/X-Same-Repos'), expected_iprops, expected_explicit_props) + + # Check the properties inherited by the external from the "other" + # repository. It should inherit from the root of the other repos, + # despite being located in the first repository's WC. + expected_iprops = { + other_repo_url : {'Other-Root-Prop' : 'Root-Prop-Val-from-other'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('E/X-Other-Repos'), expected_iprops, expected_explicit_props) + +#---------------------------------------------------------------------- +# Inherited property caching by file externals. +def iprops_with_file_externals(sbox): + "iprop caching works with file externals" + + sbox.build() + wc_dir = sbox.wc_dir + + # Create a root property. + sbox.simple_propset('Prime-Root-Prop', 'Root-Prop-Val1', '.') + svntest.main.run_svn(None, 'commit', '-m', 'Add a root property', + wc_dir) + + # Create a "branch" property on 'A/D'. + sbox.simple_propset('Prime-Branch-Prop', 'Branch-Prop-Val1', 'A/D') + svntest.main.run_svn(None, 'commit', '-m', 'Add a branch property', + wc_dir) + + # Create two file externals, one pegged to a fixed revision. + sbox.simple_propset('svn:externals', + sbox.repo_url + '/A/D/H/psi file-external', + 'A/B/E') + sbox.simple_propset('svn:externals', + sbox.repo_url + '/A/D/H/psi@4 file-external-pegged', + 'A/B/F') + svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m', + 'Add a file external', wc_dir) + svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir) + + # Check the properties inherited by the external files. Both should + # inherit the properties from ^/ and ^/A/D. + expected_iprops = { + sbox.repo_url : {'Prime-Root-Prop' : 'Root-Prop-Val1'}, + sbox.repo_url + '/A/D' : {'Prime-Branch-Prop' : 'Branch-Prop-Val1'}} + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('A/B/E/file-external'), expected_iprops, + expected_explicit_props) + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('A/B/F/file-external-pegged'), expected_iprops, + expected_explicit_props) + + # Modify the "branch" property on 'A/D'. + sbox.simple_propset('Prime-Branch-Prop', 'Branch-Prop-Val2', 'A/D') + svntest.main.run_svn(None, 'commit', '-m', 'Add a branch property', + wc_dir) + + # There should be no change in the external file's + # inherited properties until... + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('A/B/E/file-external'), expected_iprops, + expected_explicit_props) + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('A/B/F/file-external-pegged'), expected_iprops, + expected_explicit_props) + + # ...We update the external: + svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir) + # The pegged file external's iprops should remain unchanged. + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('A/B/F/file-external-pegged'), expected_iprops, + expected_explicit_props) + # But the other's should be updated. + expected_iprops = { + sbox.repo_url : {'Prime-Root-Prop' : 'Root-Prop-Val1'}, + sbox.repo_url + '/A/D' : {'Prime-Branch-Prop' : 'Branch-Prop-Val2'}} + svntest.actions.run_and_verify_inherited_prop_xml( + sbox.ospath('A/B/E/file-external'), expected_iprops, + expected_explicit_props) + +def iprops_survive_commit(sbox): + "verify that iprops survive a commit" + + sbox.build() + sbox.simple_propset('key', 'D', 'A/B',) + sbox.simple_commit() + + svntest.main.run_svn(None, 'switch', sbox.repo_url + '/A/B/E', + sbox.ospath('A/D'), '--ignore-ancestry') + svntest.main.run_svn(None, 'switch', sbox.repo_url + '/A/B/F', + sbox.ospath('iota'), '--ignore-ancestry') + expected_iprops = { + sbox.repo_url + '/A/B' : {'key' : 'D'}, + } + + expected_explicit_props = {} + svntest.actions.run_and_verify_inherited_prop_xml(sbox.ospath('A/D'), + expected_iprops, + expected_explicit_props) + svntest.actions.run_and_verify_inherited_prop_xml(sbox.ospath('iota'), + expected_iprops, + expected_explicit_props) + + sbox.simple_propset('new', 'V', 'A/D', 'iota') + sbox.simple_commit() + + expected_explicit_props = {'new': 'V'} + svntest.actions.run_and_verify_inherited_prop_xml(sbox.ospath('A/D'), + expected_iprops, + expected_explicit_props) + svntest.actions.run_and_verify_inherited_prop_xml(sbox.ospath('iota'), + expected_iprops, + expected_explicit_props) + +######################################################################## +# Run the tests + +# list all tests here, starting with None: +test_list = [ None, + iprops_basic_working, + iprops_basic_repos, + iprops_switched_subtrees, + iprops_pegged_wc_targets, + iprops_pegged_url_targets, + iprops_shallow_operative_depths, + iprops_with_directory_externals, + iprops_with_file_externals, + iprops_survive_commit, + ] + +if __name__ == '__main__': + svntest.main.run_tests(test_list) + # NOTREACHED + +### End of file. |