You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2011/08/17 21:58:48 UTC

svn commit: r1158886 - /subversion/trunk/subversion/libsvn_wc/adm_ops.c

Author: stsp
Date: Wed Aug 17 19:58:48 2011
New Revision: 1158886

URL: http://svn.apache.org/viewvc?rev=1158886&view=rev
Log:
* subversion/libsvn_wc/adm_ops.c
  (revert_restore_handle_copied_dirs): Don't ignore all errors returned by
   svn_io_dir_remove_nonrecursive(). Ignore only the ones we care about.
   Use svn_io_dir_remove_nonrecursive() to remove LOCAL_ABSPATH itself. This
   will check for remaining children so this function doesn't need to run
   the check itself.

Suggested by: rhuijben

Modified:
    subversion/trunk/subversion/libsvn_wc/adm_ops.c

Modified: subversion/trunk/subversion/libsvn_wc/adm_ops.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_ops.c?rev=1158886&r1=1158885&r2=1158886&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/adm_ops.c (original)
+++ subversion/trunk/subversion/libsvn_wc/adm_ops.c Wed Aug 17 19:58:48 2011
@@ -1332,6 +1332,7 @@ revert_restore_handle_copied_dirs(svn_no
   int i;
   svn_node_kind_t on_disk;
   apr_pool_t *iterpool;
+  svn_error_t *err;
 
   if (new_kind)
     *new_kind = svn_node_dir;
@@ -1365,9 +1366,7 @@ revert_restore_handle_copied_dirs(svn_no
       SVN_ERR(svn_io_remove_file2(child_info->abspath, TRUE, iterpool));
     }
 
-  /* Try to delete every child directory, ignoring errors.
-   * This is a bit crude but good enough for our purposes.
-   *
+  /* Delete every empty child directory.
    * We cannot delete children recursively since we want to keep any files
    * that still exist on disk (e.g. unversioned files within the copied tree).
    * So sort the children list such that longest paths come first and try to
@@ -1389,24 +1388,34 @@ revert_restore_handle_copied_dirs(svn_no
 
       svn_pool_clear(iterpool);
 
-      svn_error_clear(svn_io_dir_remove_nonrecursive(child_info->abspath,
-                                                     iterpool));
+      err = svn_io_dir_remove_nonrecursive(child_info->abspath, iterpool);
+      if (err)
+        {
+          if (APR_STATUS_IS_ENOENT(err->apr_err) ||
+              SVN__APR_STATUS_IS_ENOTDIR(err->apr_err) ||
+              APR_STATUS_IS_ENOTEMPTY(err->apr_err))
+            svn_error_clear(err);
+          else
+            return svn_error_trace(err);
+        }
     }
 
   if (remove_self)
     {
-      apr_hash_t *remaining_children;
-
       /* Delete LOCAL_ABSPATH itself if no children are left. */
-      SVN_ERR(svn_io_get_dirents3(&remaining_children, local_abspath, TRUE,
-                                  iterpool, iterpool));
-      if (apr_hash_count(remaining_children) == 0)
+      err = svn_io_dir_remove_nonrecursive(local_abspath, iterpool);
+      if (err)
         {
-          SVN_ERR(svn_io_remove_dir2(local_abspath, FALSE, NULL, NULL,
-                                     iterpool));
-          if (new_kind)
-            *new_kind = svn_node_none;
+          if (APR_STATUS_IS_ENOENT(err->apr_err) ||
+              SVN__APR_STATUS_IS_ENOTDIR(err->apr_err) ||
+              APR_STATUS_IS_ENOTEMPTY(err->apr_err))
+            svn_error_clear(err);
+          else
+            return svn_error_trace(err);
         }
+
+      if (new_kind)
+        *new_kind = svn_node_none;
     }
 
   svn_pool_destroy(iterpool);