Author: julianfoad
Date: Fri Mar 11 12:11:02 2022
New Revision: 1898850

URL: http://svn.apache.org/viewvc?rev=1898850&view=rev
Log:
On the 'pristines-on-demand-on-mwf' branch: sync with trunk@1898849.

Modified:
    subversion/branches/pristines-on-demand-on-mwf/   (props changed)
    
subversion/branches/pristines-on-demand-on-mwf/subversion/libsvn_wc/adm_crawler.c

Propchange: subversion/branches/pristines-on-demand-on-mwf/
------------------------------------------------------------------------------
  Merged /subversion/trunk:r1898820-1898849

Modified: 
subversion/branches/pristines-on-demand-on-mwf/subversion/libsvn_wc/adm_crawler.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand-on-mwf/subversion/libsvn_wc/adm_crawler.c?rev=1898850&r1=1898849&r2=1898850&view=diff
==============================================================================
--- 
subversion/branches/pristines-on-demand-on-mwf/subversion/libsvn_wc/adm_crawler.c
 (original)
+++ 
subversion/branches/pristines-on-demand-on-mwf/subversion/libsvn_wc/adm_crawler.c
 Fri Mar 11 12:11:02 2022
@@ -110,57 +110,6 @@ restore_file(svn_wc__db_t *db,
   return SVN_NO_ERROR;
 }
 
-svn_error_t *
-svn_wc_restore(svn_wc_context_t *wc_ctx,
-               const char *local_abspath,
-               svn_boolean_t use_commit_times,
-               apr_pool_t *scratch_pool)
-{
-  /* ### If ever revved: Add cancel func. */
-  svn_wc__db_status_t status;
-  svn_node_kind_t kind;
-  svn_node_kind_t disk_kind;
-  const svn_checksum_t *checksum;
-
-  SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, scratch_pool));
-
-  if (disk_kind != svn_node_none)
-    return svn_error_createf(SVN_ERR_WC_PATH_FOUND, NULL,
-                             _("The existing node '%s' can not be restored."),
-                             svn_dirent_local_style(local_abspath,
-                                                    scratch_pool));
-
-  SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL,
-                               NULL, NULL, NULL, &checksum, NULL, NULL, NULL, 
NULL,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                               NULL, NULL, NULL, NULL,
-                               wc_ctx->db, local_abspath,
-                               scratch_pool, scratch_pool));
-
-  if (status != svn_wc__db_status_normal
-      && !((status == svn_wc__db_status_added
-            || status == svn_wc__db_status_incomplete)
-           && (kind == svn_node_dir
-               || (kind == svn_node_file && checksum != NULL)
-               /* || (kind == svn_node_symlink && target)*/)))
-    {
-      return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
-                               _("The node '%s' can not be restored."),
-                               svn_dirent_local_style(local_abspath,
-                                                      scratch_pool));
-    }
-
-  if (kind == svn_node_file || kind == svn_node_symlink)
-    SVN_ERR(restore_file(wc_ctx->db, local_abspath, use_commit_times,
-                         FALSE /*mark_resolved_text_conflict*/,
-                         NULL, NULL /* cancel func, baton */,
-                         scratch_pool));
-  else
-    SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT, scratch_pool));
-
-  return SVN_NO_ERROR;
-}
-
 /* Try to restore LOCAL_ABSPATH of node type KIND and if successful,
    notify that the node is restored.  Use DB for accessing the working copy.
    If USE_COMMIT_TIMES is set, then set working file's timestamp to
@@ -207,6 +156,120 @@ restore_node(svn_wc__db_t *db,
   return SVN_NO_ERROR;
 }
 
+/* Check the node at LOCAL_ABSPATH. If it is missing on disk and has
+   a suitable status in the metadata, then restore it on disk and if
+   successful, notify that the node is restored.
+ */
+static svn_error_t *
+maybe_restore_node(svn_wc__db_t *db,
+                   const char *local_abspath,
+                   svn_boolean_t use_commit_times,
+                   svn_cancel_func_t cancel_func,
+                   void *cancel_baton,
+                   svn_wc_notify_func2_t notify_func,
+                   void *notify_baton,
+                   apr_pool_t *scratch_pool)
+{
+  svn_error_t *err;
+  svn_wc__db_status_t wrk_status;
+  svn_node_kind_t wrk_kind;
+  const svn_checksum_t *checksum;
+  svn_boolean_t conflicted;
+
+  err = svn_wc__db_read_info(&wrk_status, &wrk_kind, NULL, NULL, NULL,
+                             NULL, NULL, NULL, NULL, NULL, &checksum, NULL,
+                             NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                             NULL, &conflicted, NULL, NULL, NULL, NULL,
+                             NULL, NULL,
+                             db, local_abspath,
+                             scratch_pool, scratch_pool);
+
+
+  if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+    {
+      svn_error_clear(err);
+      wrk_status = svn_wc__db_status_not_present;
+      wrk_kind = svn_node_file;
+    }
+  else
+    SVN_ERR(err);
+
+  if ((wrk_status == svn_wc__db_status_normal
+      || wrk_status == svn_wc__db_status_added
+      || wrk_status == svn_wc__db_status_incomplete)
+      && (wrk_kind == svn_node_dir || checksum))
+    {
+      svn_node_kind_t dirent_kind;
+
+      /* It is possible on a case insensitive system that the
+         entry is not really missing, but just cased incorrectly.
+         In this case we can't overwrite it with the pristine
+         version */
+      SVN_ERR(svn_io_check_path(local_abspath, &dirent_kind, scratch_pool));
+
+      if (dirent_kind == svn_node_none)
+        {
+          SVN_ERR(restore_node(db, local_abspath,
+                               wrk_kind, conflicted, use_commit_times,
+                               cancel_func, cancel_baton,
+                               notify_func, notify_baton,
+                               scratch_pool));
+        }
+    }
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_wc_restore(svn_wc_context_t *wc_ctx,
+               const char *local_abspath,
+               svn_boolean_t use_commit_times,
+               apr_pool_t *scratch_pool)
+{
+  /* ### If ever revved: Add cancel func. */
+  svn_wc__db_status_t status;
+  svn_node_kind_t kind;
+  svn_node_kind_t disk_kind;
+  const svn_checksum_t *checksum;
+
+  SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, scratch_pool));
+
+  if (disk_kind != svn_node_none)
+    return svn_error_createf(SVN_ERR_WC_PATH_FOUND, NULL,
+                             _("The existing node '%s' can not be restored."),
+                             svn_dirent_local_style(local_abspath,
+                                                    scratch_pool));
+
+  SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL,
+                               NULL, NULL, NULL, &checksum, NULL, NULL, NULL, 
NULL,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                               NULL, NULL, NULL, NULL,
+                               wc_ctx->db, local_abspath,
+                               scratch_pool, scratch_pool));
+
+  if (status != svn_wc__db_status_normal
+      && !((status == svn_wc__db_status_added
+            || status == svn_wc__db_status_incomplete)
+           && (kind == svn_node_dir
+               || (kind == svn_node_file && checksum != NULL)
+               /* || (kind == svn_node_symlink && target)*/)))
+    {
+      return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL,
+                               _("The node '%s' can not be restored."),
+                               svn_dirent_local_style(local_abspath,
+                                                      scratch_pool));
+    }
+
+  SVN_ERR(restore_node(wc_ctx->db, local_abspath,
+                       kind, FALSE /*mark_resolved_text_conflict*/,
+                       use_commit_times,
+                       NULL, NULL /* cancel func, baton */,
+                       NULL, NULL /* notify func, baton */,
+                       scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
 /* The recursive crawler that describes a mixed-revision working
    copy to an RA layer.  Used to initiate updates.
 
@@ -392,39 +455,11 @@ report_revisions_and_depths(svn_wc__db_t
       if (restore_files
           && svn_hash_gets(dirents, child) == NULL)
         {
-          svn_wc__db_status_t wrk_status;
-          svn_node_kind_t wrk_kind;
-          const svn_checksum_t *checksum;
-          svn_boolean_t conflicted;
-
-          SVN_ERR(svn_wc__db_read_info(&wrk_status, &wrk_kind, NULL, NULL,
-                                       NULL, NULL, NULL, NULL, NULL, NULL,
-                                       &checksum, NULL, NULL, NULL, NULL, NULL,
-                                       NULL, NULL, NULL, NULL, &conflicted,
-                                       NULL, NULL, NULL, NULL, NULL, NULL,
-                                       db, this_abspath, iterpool, iterpool));
-
-          if ((wrk_status == svn_wc__db_status_normal
-               || wrk_status == svn_wc__db_status_added
-               || wrk_status == svn_wc__db_status_incomplete)
-              && (wrk_kind == svn_node_dir || checksum))
-            {
-              svn_node_kind_t dirent_kind;
-
-              /* It is possible on a case insensitive system that the
-                 entry is not really missing, but just cased incorrectly.
-                 In this case we can't overwrite it with the pristine
-                 version */
-              SVN_ERR(svn_io_check_path(this_abspath, &dirent_kind, iterpool));
-
-              if (dirent_kind == svn_node_none)
-                {
-                  SVN_ERR(restore_node(db, this_abspath, wrk_kind,
-                                       conflicted, use_commit_times,
-                                       cancel_func, cancel_baton,
-                                       notify_func, notify_baton, iterpool));
-                }
-            }
+          SVN_ERR(maybe_restore_node(db, this_abspath,
+                                     use_commit_times,
+                                     cancel_func, cancel_baton,
+                                     notify_func, notify_baton,
+                                     iterpool));
         }
 
       /* And finally prepare for reporting */
@@ -664,7 +699,6 @@ svn_wc_crawl_revisions5(svn_wc_context_t
   const char *repos_relpath, *repos_root_url;
   svn_depth_t target_depth;
   svn_wc__db_lock_t *target_lock;
-  svn_node_kind_t disk_kind;
   svn_depth_t report_depth;
   SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
 
@@ -718,49 +752,14 @@ svn_wc_crawl_revisions5(svn_wc_context_t
       start_empty = TRUE;
     }
 
-  if (restore_files)
-    SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, scratch_pool));
-  else
-    disk_kind = svn_node_unknown;
-
   /* Determine if there is a missing node that should be restored */
-  if (restore_files
-      && disk_kind == svn_node_none)
+  if (restore_files)
     {
-      svn_wc__db_status_t wrk_status;
-      svn_node_kind_t wrk_kind;
-      const svn_checksum_t *checksum;
-      svn_boolean_t conflicted;
-
-      err = svn_wc__db_read_info(&wrk_status, &wrk_kind, NULL, NULL, NULL,
-                                 NULL, NULL, NULL, NULL, NULL, &checksum, NULL,
-                                 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                                 NULL, &conflicted, NULL, NULL, NULL, NULL,
-                                 NULL, NULL,
-                                 db, local_abspath,
-                                 scratch_pool, scratch_pool);
-
-
-      if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
-        {
-          svn_error_clear(err);
-          wrk_status = svn_wc__db_status_not_present;
-          wrk_kind = svn_node_file;
-        }
-      else
-        SVN_ERR(err);
-
-      if ((wrk_status == svn_wc__db_status_normal
-          || wrk_status == svn_wc__db_status_added
-          || wrk_status == svn_wc__db_status_incomplete)
-          && (wrk_kind == svn_node_dir || checksum))
-        {
-          SVN_ERR(restore_node(wc_ctx->db, local_abspath,
-                               wrk_kind, conflicted, use_commit_times,
-                               cancel_func, cancel_baton,
-                               notify_func, notify_baton,
-                               scratch_pool));
-        }
+      SVN_ERR(maybe_restore_node(db, local_abspath,
+                                 use_commit_times,
+                                 cancel_func, cancel_baton,
+                                 notify_func, notify_baton,
+                                 scratch_pool));
     }
 
   {


Reply via email to