[[[
Fix Issue #2959: depth upgrade against old servers was broken.
* subversion/libsvn_wc/adm_crawler.c
(svn_wc_crawl_revisions3, report_revisions_and_depths): Send TRUE
for start_empty depending on entry depths and on whether or not
this is a depth upgrade.
]]]
Index: subversion/libsvn_wc/adm_crawler.c
===================================================================
--- subversion/libsvn_wc/adm_crawler.c (revision 27102)
+++ subversion/libsvn_wc/adm_crawler.c (working copy)
@@ -368,6 +368,7 @@
{
svn_wc_adm_access_t *subdir_access;
const svn_wc_entry_t *subdir_entry;
+ svn_boolean_t start_empty;
/* If a directory is missing from disk, we have no way to
recreate it locally, so report as missing and move
@@ -390,6 +391,18 @@
SVN_ERR(svn_wc_entry(&subdir_entry, this_full_path, subdir_access,
TRUE, iterpool));
+ start_empty = subdir_entry->incomplete;
+ if (subdir_entry->depth <= svn_depth_files
+ && depth > subdir_entry->depth)
+ {
+ /* For a depth-aware server, this is harmless, as it
+ knows the client's depth and won't send unnecessary
+ information anyway. But it enables a depth-unaware
+ server to upgrade a working copy directory that has
+ ambient depth svn_depth_empty or svn_depth_files. */
+ start_empty = TRUE;
+ }
+
if (report_everything)
{
/* Report the dir unconditionally, one way or another. */
@@ -398,14 +411,14 @@
subdir_entry->url,
subdir_entry->revision,
subdir_entry->depth,
- subdir_entry->incomplete,
+ start_empty,
subdir_entry->lock_token,
iterpool));
else
SVN_ERR(reporter->set_path(report_baton, this_path,
subdir_entry->revision,
subdir_entry->depth,
- subdir_entry->incomplete,
+ start_empty,
subdir_entry->lock_token,
iterpool));
}
@@ -417,7 +430,7 @@
subdir_entry->url,
subdir_entry->revision,
subdir_entry->depth,
- subdir_entry->incomplete,
+ start_empty,
subdir_entry->lock_token,
iterpool));
/* ... or perhaps just a differing revision, lock token, incomplete
@@ -435,7 +448,7 @@
this_path,
subdir_entry->revision,
subdir_entry->depth,
- subdir_entry->incomplete,
+ start_empty,
subdir_entry->lock_token,
iterpool));
@@ -445,7 +458,7 @@
reporter, report_baton,
notify_func, notify_baton,
restore_files, depth,
- subdir_entry->incomplete,
+ start_empty,
use_commit_times,
traversal_info,
iterpool));
@@ -482,6 +495,7 @@
svn_boolean_t missing = FALSE;
const svn_wc_entry_t *parent_entry = NULL;
svn_wc_notify_t *notify;
+ svn_boolean_t start_empty;
/* The first thing we do is get the base_rev from the working copy's
ROOT_DIRECTORY. This is the first revnum that entries will be
@@ -518,6 +532,11 @@
}
base_rev = entry->revision;
+
+ start_empty = entry->incomplete;
+ if (entry->depth <= svn_depth_immediates && depth > entry->depth)
+ start_empty = TRUE;
+
if (base_rev == SVN_INVALID_REVNUM)
{
const char *dirname = svn_path_dirname(path, pool);
@@ -530,8 +549,7 @@
top-level directory being updated is at BASE_REV. Its PATH
argument is ignored. */
SVN_ERR(reporter->set_path(report_baton, "", base_rev, entry->depth,
- entry->incomplete , /* start_empty ? */
- NULL, pool));
+ start_empty, NULL, pool));
if (entry->schedule != svn_wc_schedule_delete)
{
@@ -566,7 +584,7 @@
reporter, report_baton,
notify_func, notify_baton,
restore_files, depth,
- entry->incomplete,
+ start_empty,
use_commit_times,
traversal_info,
pool);