Author: philip
Date: Mon Jul 12 14:16:43 2010
New Revision: 963287
URL: http://svn.apache.org/viewvc?rev=963287&view=rev
Log:
Handle moving a directory containing a moved directory.
* subversion/libsvn_wc/copy.c
(copy_versioned_dir): Handle deleted directories in added tree.
* subversion/tests/cmdline/copy_tests.py
(move_dir_containing_move): Extend test to include a moved subdir.
Modified:
subversion/trunk/subversion/libsvn_wc/copy.c
subversion/trunk/subversion/tests/cmdline/copy_tests.py
Modified: subversion/trunk/subversion/libsvn_wc/copy.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/copy.c?rev=963287&r1=963286&r2=963287&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/copy.c (original)
+++ subversion/trunk/subversion/libsvn_wc/copy.c Mon Jul 12 14:16:43 2010
@@ -362,7 +362,35 @@ copy_versioned_dir(svn_wc__db_t *db,
if (!repos_root_url)
{
- if (status == svn_wc__db_status_added || !have_base)
+ if (status == svn_wc__db_status_deleted)
+ {
+ const char *work_del_abspath;
+
+ SVN_ERR(svn_wc__db_scan_deletion(NULL, NULL, NULL,
+ &work_del_abspath,
+ db, src_abspath,
+ scratch_pool,
scratch_pool));
+ if (work_del_abspath)
+ {
+ const char *parent_del_abspath
+ = svn_dirent_dirname(work_del_abspath, scratch_pool);
+
+ SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, NULL,
+ &repos_root_url,
+ &repos_uuid,
+ NULL, NULL, NULL, NULL,
+ db, parent_del_abspath,
+ scratch_pool,
+ scratch_pool));
+ }
+ else
+ SVN_ERR(svn_wc__db_scan_base_repos(NULL, &repos_root_url,
+ &repos_uuid,
+ db, src_abspath,
+ scratch_pool,
+ scratch_pool));
+ }
+ else if (status == svn_wc__db_status_added || !have_base)
SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, NULL,
&repos_root_url, &repos_uuid,
NULL, NULL, NULL, NULL,
Modified: subversion/trunk/subversion/tests/cmdline/copy_tests.py
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/copy_tests.py?rev=963287&r1=963286&r2=963287&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/copy_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/copy_tests.py Mon Jul 12 14:16:43
2010
@@ -4503,53 +4503,84 @@ def move_dir_containing_move(sbox):
sbox.ospath('A/B/E/alpha_moved'))
svntest.actions.run_and_verify_svn(None, None, [], 'mv',
- sbox.ospath('A/B/E'),
- sbox.ospath('A/B/E_tmp'))
+ sbox.ospath('A/B/F'),
+ sbox.ospath('A/B/F_moved'))
+
+ svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+ sbox.ospath('A/B'),
+ sbox.ospath('A/B_tmp'))
expected_status = svntest.actions.get_virginal_state(sbox.wc_dir, 1)
- expected_status.tweak('A/B/E', 'A/B/E/alpha', 'A/B/E/beta', status='D ')
+ expected_status.tweak('A/B',
+ 'A/B/E',
+ 'A/B/E/alpha',
+ 'A/B/E/beta',
+ 'A/B/F',
+ 'A/B/lambda',
+ status='D ')
expected_status.add({
- 'A/B/E_tmp' : Item(status='A ', copied='+', wc_rev='-'),
+ 'A/B_tmp' : Item(status='A ', copied='+', wc_rev='-'),
# alpha has a revision that isn't reported by status.
- 'A/B/E_tmp/alpha' : Item(status='D ', wc_rev='?', entry_rev='1'),
- 'A/B/E_tmp/alpha_moved' : Item(status='A ', copied='+', wc_rev='-'),
- 'A/B/E_tmp/beta' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B_tmp/E' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B_tmp/E/alpha' : Item(status='D ', wc_rev='?', entry_rev='1'),
+ 'A/B_tmp/E/alpha_moved' : Item(status='A ', copied='+', wc_rev='-'),
+ 'A/B_tmp/E/beta' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B_tmp/F' : Item(status='D ', wc_rev='?'),
+ 'A/B_tmp/F_moved' : Item(status='A ', copied='+', wc_rev='-'),
+ 'A/B_tmp/lambda' : Item(status=' ', copied='+', wc_rev='-'),
})
svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
svntest.actions.run_and_verify_svn(None, None, [], 'mv',
- sbox.ospath('A/B/E_tmp'),
- sbox.ospath('A/B/E_moved'))
- expected_status.remove('A/B/E_tmp',
- 'A/B/E_tmp/alpha',
- 'A/B/E_tmp/alpha_moved',
- 'A/B/E_tmp/beta')
+ sbox.ospath('A/B_tmp'),
+ sbox.ospath('A/B_moved'))
+ expected_status.remove('A/B_tmp',
+ 'A/B_tmp/E',
+ 'A/B_tmp/E/alpha',
+ 'A/B_tmp/E/alpha_moved',
+ 'A/B_tmp/E/beta',
+ 'A/B_tmp/F',
+ 'A/B_tmp/F_moved',
+ 'A/B_tmp/lambda')
expected_status.add({
- 'A/B/E_moved' : Item(status='A ', copied='+', wc_rev='-'),
+ 'A/B_moved' : Item(status='A ', copied='+', wc_rev='-'),
# alpha has a revision that isn't reported by status.
- 'A/B/E_moved/alpha' : Item(status='D ', wc_rev='?', entry_rev='1'),
- 'A/B/E_moved/alpha_moved' : Item(status='A ', copied='+', wc_rev='-'),
- 'A/B/E_moved/beta' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B_moved/E' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B_moved/E/alpha' : Item(status='D ', wc_rev='?', entry_rev='1'),
+ 'A/B_moved/E/alpha_moved' : Item(status='A ', copied='+', wc_rev='-'),
+ 'A/B_moved/E/beta' : Item(status=' ', copied='+', wc_rev='-'),
+ 'A/B_moved/F' : Item(status='D ', wc_rev='?'),
+ 'A/B_moved/F_moved' : Item(status='A ', copied='+', wc_rev='-'),
+ 'A/B_moved/lambda' : Item(status=' ', copied='+', wc_rev='-'),
})
svntest.actions.run_and_verify_status(sbox.wc_dir, expected_status)
expected_output = svntest.wc.State(sbox.wc_dir, {
- 'A/B/E' : Item(verb='Deleting'),
- 'A/B/E_moved' : Item(verb='Adding'),
- 'A/B/E_moved/alpha' : Item(verb='Deleting'),
- 'A/B/E_moved/alpha_moved': Item(verb='Adding'),
+ 'A/B' : Item(verb='Deleting'),
+ 'A/B_moved' : Item(verb='Adding'),
+ 'A/B_moved/E/alpha' : Item(verb='Deleting'),
+ 'A/B_moved/E/alpha_moved': Item(verb='Adding'),
+ 'A/B_moved/F' : Item(verb='Deleting'),
+ 'A/B_moved/F_moved' : Item(verb='Adding'),
})
- expected_status.tweak('A/B/E_moved',
- 'A/B/E_moved/alpha_moved',
- 'A/B/E_moved/beta',
+ expected_status.tweak('A/B_moved',
+ 'A/B_moved/E',
+ 'A/B_moved/E/alpha_moved',
+ 'A/B_moved/E/beta',
+ 'A/B_moved/F_moved',
+ 'A/B_moved/lambda',
status=' ', copied=None, wc_rev='2')
- expected_status.remove('A/B/E',
+ expected_status.remove('A/B',
+ 'A/B/E',
'A/B/E/alpha',
'A/B/E/beta',
- 'A/B/E_moved/alpha')
+ 'A/B/F',
+ 'A/B/lambda',
+ 'A/B_moved/E/alpha',
+ 'A/B_moved/F')
svntest.actions.run_and_verify_commit(sbox.wc_dir,
expected_output,
expected_status,