I've gone ahead and added Python tests for the below scenarios: Philip's scenario in move_tests.py and mine in svnmucc_tests.py.
I have an odd problem with Philip's scenario (move_tests.py nested_replaces): if I set expected_status['A/B'] to an Item(status='A '), I get an error stating the actual tree has a 'R ' node; and when I change the expectation to 'R ', I get an error stating the actual tree has 'A '. The patch and the two error outputs are attached. (I note that one of them says "in status tree" and one "in entries tree".) That patch isn't ready for commit; I am only at the point of constructing a State object that will make the test pass, but I haven't yet compared that State object to the actual moves the test does to determine whether the 'svn status' output is buggy or correct. I'm not really familiar with expected_status objects, so perhaps someone can have a look at constructing the State object here? Daniel Daniel Shahaf wrote on Tue, Jun 25, 2013 at 21:53:07 +0000: > On Tue, Jun 25, 2013 at 12:42:55PM +0100, Philip Martin wrote: > > R /A (from /X/Y/Z:1) > > A /A/B (from /A/B:1) > > R /A/B/C (from /X:1) > > D /A/B/C/Y > > R /X (from /A/B/C:1) > > A /X/Y (from /X/Y:1) > > R /X/Y/Z (from /A:1) > > D /X/Y/Z/B > > > > What if we had three trees? > > % svnmucc -mm -U $URL \ > rm A rm M rm X \ > cp HEAD X/Y/Z A cp HEAD A/B/C M cp HEAD M/N/O X \ > cp HEAD A/B A/B cp HEAD M/N M/N cp HEAD X/Y X/Y \ > rm A/B/C rm M/N/O rm X/Y/Z \ > cp HEAD X A/B/C cp HEAD A M/N/O cp HEAD M X/Y/Z \ > ; > r2 committed by danielsh at 2013-06-25T21:51:29.046012Z > % svn log qv -r2 $URL > ------------------------------------------------------------------------ > r2 | danielsh | 2013-06-25 21:51:29 +0000 (Tue, 25 Jun 2013) > Changed paths: > R /A (from /X/Y/Z:1) > A /A/B (from /A/B:1) > R /A/B/C (from /X:1) > R /M (from /A/B/C:1) > A /M/N (from /M/N:1) > R /M/N/O (from /A:1) > R /X (from /M/N/O:1) > A /X/Y (from /X/Y:1) > R /X/Y/Z (from /M:1) > ------------------------------------------------------------------------ > > How would such a thing be represented? > > > How would Ev2 describe that? Perhaps
Index: subversion/tests/cmdline/move_tests.py =================================================================== --- subversion/tests/cmdline/move_tests.py (revision 1496890) +++ subversion/tests/cmdline/move_tests.py (working copy) @@ -1247,7 +1247,7 @@ def nested_replaces(sbox): '-m', 'r1: create tree', repo_url + '/A/B/C', repo_url + '/X/Y/Z') svntest.main.run_svn(None, 'checkout', '-q', repo_url, wc_dir) - expected_status = svntest.wc.State(wc_dir, { + r1_status = svntest.wc.State(wc_dir, { '' : Item(status=' ', wc_rev='1'), 'A' : Item(status=' ', wc_rev='1'), 'A/B' : Item(status=' ', wc_rev='1'), @@ -1256,7 +1256,7 @@ def nested_replaces(sbox): 'X/Y' : Item(status=' ', wc_rev='1'), 'X/Y/Z' : Item(status=' ', wc_rev='1'), }) - svntest.actions.run_and_verify_status(wc_dir, expected_status) + svntest.actions.run_and_verify_status(wc_dir, r1_status) ## r2: juggling moves = [ @@ -1271,10 +1271,23 @@ def nested_replaces(sbox): ] for src, dst in moves: svntest.main.run_svn(None, 'mv', ospath(src), ospath(dst)) - # svntest.actions.run_and_verify_status(wc_dir, expected_status) + r2_status = svntest.wc.State(wc_dir, { + '' : Item(status=' ', wc_rev='1'), + 'A' : Item(status='R ', copied='+', moved_from='X/Y/Z', moved_to='X/Y/Z', wc_rev='-'), + 'A/B' : Item(status='A ', copied='+', moved_from='X/Y/Z/B', wc_rev='-'), ### this line has the status='A '/'R ' in question + 'A/B/C' : Item(status='R ', copied='+', moved_from='X', moved_to='X', wc_rev='-'), + 'A/B/C/Y' : Item(status='D ', copied='+', wc_rev='-', moved_to='X/Y'), + 'A/B/C/Y/Z' : Item(status='D ', copied='+', wc_rev='-'), + 'X' : Item(status='R ', copied='+', moved_from='A/B/C', moved_to='A/B/C', wc_rev='-'), + 'X/Y' : Item(status='A ', copied='+', moved_from='A/B/C/Y', wc_rev='-'), + 'X/Y/Z' : Item(status='R ', copied='+', moved_from='A', moved_to='A', wc_rev='-'), + 'X/Y/Z/B' : Item(status='D ', copied='+', wc_rev='-', moved_to='A/B'), + 'X/Y/Z/B/C' : Item(status='D ', copied='+', wc_rev='-'), + }) + svntest.actions.run_and_verify_status(wc_dir, r2_status) svntest.main.run_svn(None, 'commit', '-m', 'r2: juggle the tree', wc_dir) - expected_output = svntest.verify.UnorderedRegexListOutput(map(re.escape, [ + r1_status = svntest.verify.UnorderedRegexListOutput(map(re.escape, [ ' R /A (from /X/Y/Z:1)', ' A /A/B (from /A/B:1)', ' R /A/B/C (from /X:1)',
W: ============================================================= Expected 'B' and actual 'B' in entries tree are different! ============================================================= EXPECTED NODE TO BE: ============================================================= * Node name: B Path: svn-test-work/working_copies/move_tests-7.blank/A/B Contents: None Properties: {} Attributes: {'status': 'A ', 'copied': '+', 'wc_rev': '-'} Children: None (node is probably a file) ============================================================= ACTUAL NODE FOUND: ============================================================= * Node name: B Path: svn-test-work/working_copies/move_tests-7.blank/A/B Contents: None Properties: {} Attributes: {'status': 'R ', 'copied': '+', 'wc_rev': '-'} Children: None (node is probably a file)
W: ============================================================= Expected 'B' and actual 'B' in status tree are different! ============================================================= EXPECTED NODE TO BE: ============================================================= * Node name: B Path: svn-test-work/working_copies/move_tests-7.blank/A/B Contents: None Properties: {} Attributes: {'status': 'R ', 'copied': '+', 'moved_from': 'svn-test-work/wor king_copies/move_tests-7.blank/X/Y/Z/B', 'wc_rev': '-'} Children: None (node is probably a file) ============================================================= ACTUAL NODE FOUND: ============================================================= * Node name: B Path: svn-test-work/working_copies/move_tests-7.blank/A/B Contents: None Properties: {} Attributes: {'status': 'A ', 'copied': '+', 'moved_from': 'svn-test-work/wor king_copies/move_tests-7.blank/X/Y/Z/B', 'wc_rev': '-'} Children: None (node is probably a file)