You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2010/08/01 10:40:43 UTC

svn commit: r981171 - in /subversion/trunk/subversion: libsvn_wc/adm_ops.c libsvn_wc/workqueue.c tests/cmdline/revert_tests.py

Author: rhuijben
Date: Sun Aug  1 08:40:42 2010
New Revision: 981171

URL: http://svn.apache.org/viewvc?rev=981171&view=rev
Log:
Fix the revert_tests.py 16 "status after schedule-delete, revert, and local
rm" scenario, by making revert capable of restoring missing directories.

* subversion/libsvn_wc/adm_ops.c
  (revert_internal): Check to see if the node should be handled as
    unversioned. Allow reverting missing directories in single-db.
    Allow restoring the future symlink type.

* subversion/libsvn_wc/workqueue.c
  (run_revert): Implement reverting a missing directory for single-db.

* subversion/tests/cmdline/revert_tests.py
  (status_of_missing_dir_after_revert): Extend test to assume missing
    directories can be restored in single-db mode.

Modified:
    subversion/trunk/subversion/libsvn_wc/adm_ops.c
    subversion/trunk/subversion/libsvn_wc/workqueue.c
    subversion/trunk/subversion/tests/cmdline/revert_tests.py

Modified: subversion/trunk/subversion/libsvn_wc/adm_ops.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_ops.c?rev=981171&r1=981170&r2=981171&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/adm_ops.c (original)
+++ subversion/trunk/subversion/libsvn_wc/adm_ops.c Sun Aug  1 08:40:42 2010
@@ -1653,7 +1653,17 @@ revert_internal(svn_wc__db_t *db,
   else if (err)
     return svn_error_return(err);
   else
-    unversioned = FALSE;
+    switch (status)
+      {
+        case svn_wc__db_status_not_present:
+        case svn_wc__db_status_absent:
+        case svn_wc__db_status_excluded:
+          unversioned = TRUE;
+          break;
+        default:
+          unversioned = FALSE;
+          break;
+      }
 
   SVN_ERR(svn_wc__db_op_read_tree_conflict(&tree_conflict, db, local_abspath,
                                            pool, pool));
@@ -1666,9 +1676,13 @@ revert_internal(svn_wc__db_t *db,
   SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, pool));
   if (!unversioned && (db_kind == svn_wc__db_kind_dir))
     {
+#ifndef SVN_WC__SINGLE_DB
       if ((disk_kind != svn_node_dir)
           && (status != svn_wc__db_status_added)
           && (status != svn_wc__db_status_obstructed_add))
+#else
+      if (disk_kind == svn_node_file)
+#endif
         {
           /* When the directory itself is missing, we can't revert without
              hitting the network.  Someday a '--force' option will
@@ -1687,7 +1701,9 @@ revert_internal(svn_wc__db_t *db,
 
   /* Safeguard 2:  can we handle this entry's recorded kind? */
   if (!unversioned
-      && (db_kind != svn_wc__db_kind_file) && (db_kind != svn_wc__db_kind_dir))
+      && (db_kind != svn_wc__db_kind_file)
+      && (db_kind != svn_wc__db_kind_dir)
+      && (db_kind != svn_wc__db_kind_symlink))
     return svn_error_createf
       (SVN_ERR_UNSUPPORTED_FEATURE, NULL,
        _("Cannot revert '%s': unsupported entry node kind"),

Modified: subversion/trunk/subversion/libsvn_wc/workqueue.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/workqueue.c?rev=981171&r1=981170&r2=981171&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/workqueue.c (original)
+++ subversion/trunk/subversion/libsvn_wc/workqueue.c Sun Aug  1 08:40:42 2010
@@ -293,6 +293,16 @@ run_revert(svn_wc__db_t *db,
     {
       SVN__NOT_IMPLEMENTED();
     }
+#ifdef SVN_WC__SINGLE_DB
+  else if (kind == svn_wc__db_kind_dir)
+    {
+      svn_node_kind_t disk_kind;
+      SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, scratch_pool));
+
+      if (disk_kind == svn_node_none)
+        SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT, scratch_pool));
+    }
+#endif
 
   if (kind == svn_wc__db_kind_dir)
     parent_abspath = local_abspath;

Modified: subversion/trunk/subversion/tests/cmdline/revert_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/revert_tests.py?rev=981171&r1=981170&r2=981171&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/revert_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/revert_tests.py Sun Aug  1 08:40:42 2010
@@ -740,20 +740,35 @@ def status_of_missing_dir_after_revert(s
   svntest.actions.run_and_verify_svn(None, expected_output, [], "revert",
                                      A_D_G_path)
 
-  expected_output = svntest.verify.UnorderedOutput(
-    ["D       " + os.path.join(A_D_G_path, "pi") + "\n",
+  deletes = [
+     "D       " + os.path.join(A_D_G_path, "pi") + "\n",
      "D       " + os.path.join(A_D_G_path, "rho") + "\n",
-     "D       " + os.path.join(A_D_G_path, "tau") + "\n"])
+     "D       " + os.path.join(A_D_G_path, "tau") + "\n"
+  ]
+  expected_output = svntest.verify.UnorderedOutput(deletes)
   svntest.actions.run_and_verify_svn(None, expected_output, [],
                                      "status", wc_dir)
 
   svntest.main.safe_rmtree(A_D_G_path)
 
-  expected_output = svntest.verify.UnorderedOutput(
-    ["!       " + A_D_G_path + "\n"])
+  expected_output = ["!       " + A_D_G_path + "\n"]
+
+  if svntest.main.wc_is_singledb(wc_dir):
+    expected_output.extend(deletes)
+
+  expected_output = svntest.verify.UnorderedOutput(expected_output)
+
   svntest.actions.run_and_verify_svn(None, expected_output, [], "status",
                                      wc_dir)
 
+  # When using single-db, we can get back to the virginal state.
+  if svntest.main.wc_is_singledb(wc_dir):
+    svntest.actions.run_and_verify_svn(None, None, [], "revert",
+                                       "-R", A_D_G_path)
+
+    expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
 #----------------------------------------------------------------------
 # Test for issue #2804 with replaced directory
 def status_of_missing_dir_after_revert_replaced_with_history_dir(sbox):