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,


Reply via email to