Index: subversion/include/svn_client.h =================================================================== --- subversion/include/svn_client.h (revision 1075841) +++ subversion/include/svn_client.h (working copy) @@ -1201,6 +1201,9 @@ * files restored from text-base. If @a ctx->cancel_func is non-NULL, invoke * it passing @a ctx->cancel_baton at various places during the update. * + * If @a dry_run is TRUE, do a dry run update. You may not pass @a dry_run + * as TRUE with @a make_parents and/or @a depth_is_sticky as TRUE. + * * Use @a pool for any temporary allocation. * * @todo Multiple Targets @@ -1225,6 +1228,7 @@ svn_boolean_t ignore_externals, svn_boolean_t allow_unver_obstructions, svn_boolean_t make_parents, + svn_boolean_t dry_run, svn_client_ctx_t *ctx, apr_pool_t *pool); Index: subversion/libsvn_client/deprecated.c =================================================================== --- subversion/libsvn_client/deprecated.c (revision 1075841) +++ subversion/libsvn_client/deprecated.c (working copy) @@ -1808,7 +1808,7 @@ { return svn_client_update4(result_revs, paths, revision, depth, depth_is_sticky, ignore_externals, - allow_unver_obstructions, FALSE, ctx, pool); + allow_unver_obstructions, FALSE, FALSE, ctx, pool); } svn_error_t * Index: subversion/include/svn_wc.h =================================================================== --- subversion/include/svn_wc.h (revision 1075841) +++ subversion/include/svn_wc.h (working copy) @@ -4990,7 +4990,8 @@ * @a notify_baton and the path of the restored file. @a notify_func may * be @c NULL if this notification is not required. If @a * use_commit_times is TRUE, then set restored files' timestamps to - * their last-commit-times. + * their last-commit-times. If @a dry_run is TRUE, only notifications are + * done. Using @a dry_run is meaningless if @a restore_files is FALSE. * * If @a traversal_info is non-NULL, then record pre-update traversal * state in it. (Caller should obtain @a traversal_info from @@ -5007,6 +5008,7 @@ const svn_ra_reporter3_t *reporter, void *report_baton, svn_boolean_t restore_files, + svn_boolean_t dry_run, svn_depth_t depth, svn_boolean_t honor_depth_exclude, svn_boolean_t depth_compatibility_trick, @@ -5292,6 +5294,8 @@ * #svn_depth_unknown, then in addition to updating PATHS, also set * their sticky ambient depth value to @a depth. * + * If @a dry_run is set, get a dry run editor. + * * @since New in 1.7. */ svn_error_t * @@ -5305,6 +5309,7 @@ svn_depth_t depth, svn_boolean_t depth_is_sticky, svn_boolean_t allow_unver_obstructions, + svn_boolean_t dry_run, const char *diff3_cmd, const apr_array_header_t *preserved_exts, svn_wc_conflict_resolver_func_t conflict_func, Index: subversion/libsvn_wc/deprecated.c =================================================================== --- subversion/libsvn_wc/deprecated.c (revision 1075841) +++ subversion/libsvn_wc/deprecated.c (working copy) @@ -145,6 +145,7 @@ reporter, report_baton, restore_files, + FALSE, depth, honor_depth_exclude, depth_compatibility_trick, @@ -2944,7 +2945,7 @@ use_commit_times, depth, depth_is_sticky, allow_unver_obstructions, - diff3_cmd, + FALSE, diff3_cmd, preserved_exts, conflict_func, conflict_baton, external_func, eb, Index: subversion/libsvn_client/client.h =================================================================== --- subversion/libsvn_client/client.h (revision 1075841) +++ subversion/libsvn_client/client.h (working copy) @@ -479,7 +479,11 @@ (with depth=empty) any parent directories of the requested update target which are missing from the working copy. + If DRY_RUN is true, perform a dry run update. + NOTE: You may not specify both INNERUPDATE and MAKE_PARENTS as true. + You may not specify DRY_RUN with MAKE_PARENTS and/or + DEPTH_IS_STICKY as true. */ svn_error_t * svn_client__update_internal(svn_revnum_t *result_rev, @@ -492,6 +496,7 @@ svn_boolean_t *timestamp_sleep, svn_boolean_t innerupdate, svn_boolean_t make_parents, + svn_boolean_t dry_run, svn_client_ctx_t *ctx, apr_pool_t *pool); Index: subversion/svn/main.c =================================================================== --- subversion/svn/main.c (revision 1075841) +++ subversion/svn/main.c (working copy) @@ -1381,7 +1381,7 @@ " targets of this operation.\n"), {'r', 'N', opt_depth, opt_set_depth, 'q', opt_merge_cmd, opt_force, opt_ignore_externals, opt_changelist, opt_editor_cmd, opt_accept, - opt_parents} }, + opt_parents, opt_dry_run} }, { "upgrade", svn_cl__upgrade, {0}, N_ ("Upgrade the metadata storage format for a working copy.\n" @@ -1733,6 +1733,13 @@ opt_state.force_log = TRUE; break; case opt_dry_run: + if (opt_state.parents) + { + err = svn_error_create + (SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("Can't specify --parents with --dry-run")); + return svn_cmdline_handle_exit_error(err, pool, "svn: "); + } opt_state.dry_run = TRUE; break; case opt_revprop: @@ -1764,6 +1771,14 @@ } break; case opt_set_depth: + if (opt_state.dry_run) + { + err = svn_error_create + (SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("Can't specify --set-depth with --dry-run")); + return svn_cmdline_handle_exit_error(err, pool, "svn: "); + } + err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool); if (err) return svn_cmdline_handle_exit_error Index: subversion/libsvn_client/update.c =================================================================== --- subversion/libsvn_client/update.c (revision 1075841) +++ subversion/libsvn_client/update.c (working copy) @@ -68,6 +68,7 @@ svn_boolean_t *timestamp_sleep, svn_boolean_t innerupdate, svn_boolean_t notify_summary, + svn_boolean_t dry_run, svn_client_ctx_t *ctx, apr_pool_t *pool) { @@ -209,7 +210,7 @@ &revnum, ctx->wc_ctx, anchor_abspath, target, use_commit_times, depth, depth_is_sticky, allow_unver_obstructions, - diff3_cmd, preserved_exts, + dry_run, diff3_cmd, preserved_exts, ctx->conflict_func, ctx->conflict_baton, svn_client__external_info_gatherer, &efb, ctx->cancel_func, ctx->cancel_baton, @@ -229,7 +230,8 @@ PATH. When we call reporter->finish_report, the update_editor will be driven by svn_repos_dir_delta2. */ err = svn_wc_crawl_revisions5(ctx->wc_ctx, local_abspath, reporter, - report_baton, TRUE, depth, (! depth_is_sticky), + report_baton, TRUE, dry_run, depth, + (! depth_is_sticky), (! server_supports_depth), use_commit_times, svn_client__external_info_gatherer, @@ -248,7 +250,7 @@ /* We handle externals after the update is complete, so that handling external items (and any errors therefrom) doesn't delay the primary operation. */ - if (SVN_DEPTH_IS_RECURSIVE(depth) && (! ignore_externals)) + if (SVN_DEPTH_IS_RECURSIVE(depth) && (! ignore_externals) && (! dry_run)) { SVN_ERR(svn_client__gather_externals_in_locally_added_dirs( efb.externals_new, efb.ambient_depths, anchor_abspath, @@ -296,6 +298,7 @@ svn_boolean_t *timestamp_sleep, svn_boolean_t innerupdate, svn_boolean_t make_parents, + svn_boolean_t dry_run, svn_client_ctx_t *ctx, apr_pool_t *pool) { @@ -346,7 +349,7 @@ &peg_revision, svn_depth_empty, FALSE, ignore_externals, allow_unver_obstructions, timestamp_sleep, innerupdate, FALSE, - ctx, pool); + dry_run, ctx, pool); if (err) goto cleanup; anchor_abspath = missing_parent; @@ -369,7 +372,8 @@ err = update_internal(result_rev, local_abspath, anchor_abspath, &peg_revision, depth, depth_is_sticky, ignore_externals, allow_unver_obstructions, - timestamp_sleep, innerupdate, TRUE, ctx, pool); + timestamp_sleep, innerupdate, TRUE, + dry_run, ctx, pool); cleanup: err = svn_error_compose_create( err, @@ -388,6 +392,7 @@ svn_boolean_t ignore_externals, svn_boolean_t allow_unver_obstructions, svn_boolean_t make_parents, + svn_boolean_t dry_run, svn_client_ctx_t *ctx, apr_pool_t *pool) { @@ -426,7 +431,7 @@ ignore_externals, allow_unver_obstructions, &sleep, FALSE, make_parents, - ctx, subpool); + dry_run, ctx, subpool); if (err && err->apr_err != SVN_ERR_WC_NOT_WORKING_COPY) { Index: subversion/svn/update-cmd.c =================================================================== --- subversion/svn/update-cmd.c (revision 1075841) +++ subversion/svn/update-cmd.c (working copy) @@ -167,6 +167,7 @@ depth, depth_is_sticky, opt_state->ignore_externals, opt_state->force, opt_state->parents, + opt_state->dry_run, ctx, scratch_pool)); if (! opt_state->quiet) Index: subversion/libsvn_wc/update_editor.c =================================================================== --- subversion/libsvn_wc/update_editor.c (revision 1075841) +++ subversion/libsvn_wc/update_editor.c (working copy) @@ -189,6 +189,9 @@ /* Allow unversioned obstructions when adding a path. */ svn_boolean_t allow_unver_obstructions; + + /* Is this a dry run? */ + svn_boolean_t dry_run; /* If this is a 'switch' operation, the new relpath of target_abspath, else NULL. */ @@ -230,10 +233,30 @@ pathnames and the values unspecified. */ apr_hash_t *skipped_trees; + /* Nodes that were not removed during a dry run edit. The keys are + absolute pathnames and the values unspecified. */ + apr_hash_t *dry_run_deletions; + apr_pool_t *pool; }; +/* Record in the edit baton EB that LOCAL_ABSPATH was not deleted in a + * dry run. + * + * Add to EB->dry_run_deletions a copy (allocated in EB->pool) of the string + * LOCAL_ABSPATH. + */ +static svn_error_t * +remember_dry_run_deletion(struct edit_baton *eb, const char *local_abspath) +{ + SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); + apr_hash_set(eb->dry_run_deletions, apr_pstrdup(eb->pool, local_abspath), + APR_HASH_KEY_STRING, (void*)1); + + return SVN_NO_ERROR; +} + /* Record in the edit baton EB that LOCAL_ABSPATH's base version is not being * updated. * @@ -737,8 +760,9 @@ iterpool = svn_pool_create(pool); /* Mark THIS_DIR complete. */ - SVN_ERR(svn_wc__db_temp_op_set_base_incomplete(eb->db, local_abspath, FALSE, - iterpool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_temp_op_set_base_incomplete(eb->db, local_abspath, FALSE, + iterpool)); if (eb->depth_is_sticky) { @@ -825,14 +849,16 @@ eb->db, node_abspath, iterpool, iterpool)); - if (!tree_conflict - || tree_conflict->reason != svn_wc_conflict_reason_unversioned) + if ((!tree_conflict + || tree_conflict->reason != svn_wc_conflict_reason_unversioned) + && (! eb->dry_run)) SVN_ERR(svn_wc__db_base_remove(eb->db, node_abspath, iterpool)); } else if (status == svn_wc__db_status_absent && revnum != *eb->target_revision) { - SVN_ERR(svn_wc__db_base_remove(eb->db, node_abspath, iterpool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_base_remove(eb->db, node_abspath, iterpool)); } } @@ -1234,12 +1260,12 @@ db->was_incomplete = (status == svn_wc__db_status_incomplete); /* ### TODO: Skip if inside a conflicted tree. */ - - SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db, - db->local_abspath, - db->new_relpath, - *eb->target_revision, - pool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db, + db->local_abspath, + db->new_relpath, + *eb->target_revision, + pool)); } return SVN_NO_ERROR; @@ -1950,8 +1976,8 @@ || status == svn_wc__db_status_excluded || status == svn_wc__db_status_absent) { - SVN_ERR(svn_wc__db_base_remove(eb->db, local_abspath, pool)); - + if (! eb->dry_run) + SVN_ERR(svn_wc__db_base_remove(eb->db, local_abspath, pool)); if (strcmp(local_abspath, eb->target_abspath) == 0) eb->target_deleted = TRUE; @@ -1981,10 +2007,11 @@ /* ### Note that we still add this on the parent of a node, so it is ### safe to add it now, while we remove the node later */ - SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, - tree_conflict->local_abspath, - tree_conflict, - pool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, + tree_conflict->local_abspath, + tree_conflict, + pool)); SVN_ERR(remember_skipped_tree(eb, local_abspath)); @@ -1999,9 +2026,9 @@ * To prepare the "accept mine" resolution for the tree conflict, * we must schedule the existing content for re-addition as a copy * of what it was, but with its local modifications preserved. */ + if (! eb->dry_run) + SVN_ERR(svn_wc__db_temp_op_make_copy(eb->db, local_abspath, pool)); - SVN_ERR(svn_wc__db_temp_op_make_copy(eb->db, local_abspath, pool)); - /* Fall through to remove the BASE_NODEs properly, with potentially keeping a not-present marker */ } @@ -2034,27 +2061,33 @@ If the thing being deleted is the *target* of this update, then we need to recreate a 'deleted' entry, so that the parent can give accurate reports about itself in the future. */ - if (strcmp(local_abspath, eb->target_abspath) != 0) + if (! eb->dry_run) { - /* Delete, and do not leave a not-present node. */ - SVN_ERR(svn_wc__wq_build_base_remove(&work_item, - eb->db, local_abspath, FALSE, - pool, pool)); - SVN_ERR(svn_wc__db_wq_add(eb->db, dir_abspath, work_item, pool)); + if (strcmp(local_abspath, eb->target_abspath) != 0) + { + /* Delete, and do not leave a not-present node. */ + SVN_ERR(svn_wc__wq_build_base_remove(&work_item, + eb->db, local_abspath, FALSE, + pool, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, dir_abspath, work_item, pool)); + } + else + { + /* Delete, leaving a not-present node. */ + SVN_ERR(svn_wc__wq_build_base_remove(&work_item, + eb->db, local_abspath, TRUE, + pool, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, dir_abspath, work_item, pool)); + eb->target_deleted = TRUE; + } + + SVN_ERR(svn_wc__wq_run(eb->db, dir_abspath, + eb->cancel_func, eb->cancel_baton, + pool)); } - else - { - /* Delete, leaving a not-present node. */ - SVN_ERR(svn_wc__wq_build_base_remove(&work_item, - eb->db, local_abspath, TRUE, - pool, pool)); - SVN_ERR(svn_wc__db_wq_add(eb->db, dir_abspath, work_item, pool)); - eb->target_deleted = TRUE; - } + else if (strcmp(local_abspath, eb->target_abspath) == 0) + eb->target_deleted = TRUE; - SVN_ERR(svn_wc__wq_run(eb->db, dir_abspath, - eb->cancel_func, eb->cancel_baton, - pool)); /* Notify. (If tree_conflict, we've already notified.) */ if (tree_conflict == NULL) @@ -2086,6 +2119,8 @@ their_relpath = svn_relpath_join(pb->new_relpath, base, pool); + if (pb->edit_baton->dry_run) + SVN_ERR(remember_dry_run_deletion(pb->edit_baton, local_abspath)); return do_entry_deletion(pb->edit_baton, local_abspath, their_relpath, pb->in_deleted_and_tree_conflicted_subtree, @@ -2202,9 +2237,10 @@ && previous_tc->reason == svn_wc_conflict_reason_unversioned) { /* Remove tree conflict. */ - SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, - db->local_abspath, - NULL, pool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, + db->local_abspath, + NULL, pool)); /* Don't skip this path after all. */ conflicted = FALSE; } @@ -2371,13 +2407,15 @@ /* If we are skipping an add, we need to tell the WC that * there's a node supposed to be here which we don't have. */ - SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db, db->local_abspath, - db->new_relpath, - eb->repos_root, - eb->repos_uuid, - *eb->target_revision, - svn_wc__db_kind_dir, - NULL, NULL, pool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db, + db->local_abspath, + db->new_relpath, + eb->repos_root, + eb->repos_uuid, + *eb->target_revision, + svn_wc__db_kind_dir, + NULL, NULL, pool)); SVN_ERR(remember_skipped_tree(eb, db->local_abspath)); /* Mark a conflict */ @@ -2395,8 +2433,9 @@ { /* Queue this conflict in the parent so that its descendants are skipped silently. */ - SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, db->local_abspath, - tree_conflict, pool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, db->local_abspath, + tree_conflict, pool)); SVN_ERR(remember_skipped_tree(eb, db->local_abspath)); @@ -2408,20 +2447,23 @@ return SVN_NO_ERROR; } + if (! eb->dry_run) + { + SVN_ERR(svn_wc__db_temp_op_set_new_dir_to_incomplete(eb->db, + db->local_abspath, + db->new_relpath, + eb->repos_root, + eb->repos_uuid, + *eb->target_revision, + db->ambient_depth, + pool)); + + SVN_ERR(svn_wc__ensure_directory(db->local_abspath, pool)); + } - SVN_ERR(svn_wc__db_temp_op_set_new_dir_to_incomplete(eb->db, - db->local_abspath, - db->new_relpath, - eb->repos_root, - eb->repos_uuid, - *eb->target_revision, - db->ambient_depth, - pool)); - - SVN_ERR(svn_wc__ensure_directory(db->local_abspath, pool)); - if (!pb->in_deleted_and_tree_conflicted_subtree - && status == svn_wc__db_status_added) + && status == svn_wc__db_status_added + && ! eb->dry_run) /* If there is no conflict we take over any added directory */ SVN_ERR(svn_wc__db_temp_op_remove_working(eb->db, db->local_abspath, pool)); @@ -2531,8 +2573,11 @@ if (tree_conflict != NULL) { /* Place a tree conflict into the parent work queue. */ - SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, db->local_abspath, - tree_conflict, pool)); + if (! eb->dry_run) + { + SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, db->local_abspath, + tree_conflict, pool)); + } do_notification(eb, db->local_abspath, svn_node_dir, svn_wc_notify_tree_conflict, pool); @@ -2554,10 +2599,11 @@ } /* Mark directory as being at target_revision and URL, but incomplete. */ - SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db, db->local_abspath, - db->new_relpath, - *eb->target_revision, - pool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_temp_op_start_directory_update(eb->db, db->local_abspath, + db->new_relpath, + *eb->target_revision, + pool)); return SVN_NO_ERROR; } @@ -2636,6 +2682,7 @@ svn_revnum_t new_changed_rev; apr_time_t new_changed_date; const char *new_changed_author; + svn_error_t *err; /* Skip if we're in a conflicted tree. */ if (db->skip_this) @@ -2655,19 +2702,29 @@ ®ular_props, pool)); /* Fetch the existing properties. */ - SVN_ERR(svn_wc__get_pristine_props(&base_props, - eb->db, db->local_abspath, - pool, pool)); - SVN_ERR(svn_wc__get_actual_props(&actual_props, - eb->db, db->local_abspath, - pool, pool)); - /* Local-add nodes have no pristines. Incoming-adds have no actuals. */ - if (base_props == NULL) - base_props = apr_hash_make(pool); - if (actual_props == NULL) - actual_props = apr_hash_make(pool); + err = svn_wc__get_pristine_props(&base_props, + eb->db, db->local_abspath, + pool, pool); + if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND && eb->dry_run) + svn_error_clear(err); + else + SVN_ERR(err); + err = (svn_wc__get_actual_props(&actual_props, + eb->db, db->local_abspath, + pool, pool)); + if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND && eb->dry_run) + svn_error_clear(err); + else + SVN_ERR(err); + + /* Local-add nodes have no pristines. Incoming-adds have no actuals. */ + if (base_props == NULL) + base_props = apr_hash_make(pool); + if (actual_props == NULL) + actual_props = apr_hash_make(pool); + /* An incomplete directory might have props which were supposed to be deleted but weren't. Because the server sent us all the props we're supposed to have, any previous base props not in this list must be @@ -2760,7 +2817,7 @@ actual_props, regular_props, TRUE /* base_merge */, - FALSE /* dry_run */, + eb->dry_run, eb->conflict_func, eb->conflict_baton, eb->cancel_func, @@ -2769,7 +2826,8 @@ pool), _("Couldn't do property merge")); /* After a (not-dry-run) merge, we ALWAYS have props to save. */ - SVN_ERR_ASSERT(new_base_props != NULL && new_actual_props != NULL); + if (! eb->dry_run) + SVN_ERR_ASSERT(new_base_props != NULL && new_actual_props != NULL); } SVN_ERR(accumulate_last_change(&new_changed_rev, @@ -2781,11 +2839,13 @@ /* If this directory is merely an anchor for a targeted child, then we should not be updating the node at all. */ - if (db->parent_baton == NULL - && *eb->target_basename != '\0') + if ((db->parent_baton == NULL + && *eb->target_basename != '\0') + || eb->dry_run) { /* And we should not have received any changes! */ - SVN_ERR_ASSERT(db->propchanges->nelts == 0); + if (! eb->dry_run) + SVN_ERR_ASSERT(db->propchanges->nelts == 0); /* ... which also implies NEW_CHANGED_* are not set, and NEW_BASE_PROPS == NULL. */ } @@ -2956,12 +3016,13 @@ pool, pool)); repos_relpath = svn_dirent_join(repos_relpath, name, pool); - SVN_ERR(svn_wc__db_base_add_absent_node(eb->db, local_abspath, - repos_relpath, repos_root_url, - repos_uuid, *(eb->target_revision), - db_kind, svn_wc__db_status_absent, - NULL, NULL, - pool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_base_add_absent_node(eb->db, local_abspath, + repos_relpath, repos_root_url, + repos_uuid, *(eb->target_revision), + db_kind, svn_wc__db_status_absent, + NULL, NULL, + pool)); return SVN_NO_ERROR; } @@ -3020,7 +3081,8 @@ return SVN_NO_ERROR; } - SVN_ERR(check_path_under_root(pb->local_abspath, fb->name, pool)); + if (! eb->dry_run) + SVN_ERR(check_path_under_root(pb->local_abspath, fb->name, pool)); fb->deleted = pb->in_deleted_and_tree_conflicted_subtree; @@ -3087,15 +3149,19 @@ && previous_tc->reason == svn_wc_conflict_reason_unversioned) { /* Remove tree conflict. */ - SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, - fb->local_abspath, - NULL, subpool)); - - /* Verify that all conflicts are gone now. Since we don't ever have - * text/prop conflicts next to tree conflicts, this should always - * set CONFLICTED to FALSE. Making sure doesn't hurt though. */ - SVN_ERR(node_already_conflicted(&conflicted, eb->db, - fb->local_abspath, subpool)); + if (! eb->dry_run) + { + SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, + fb->local_abspath, + NULL, subpool)); + + /* Verify that all conflicts are gone now. Since we don't ever have + * text/prop conflicts next to tree conflicts, this should always + * set CONFLICTED to FALSE. Making sure doesn't hurt though. */ + SVN_ERR(node_already_conflicted(&conflicted, eb->db, + fb->local_abspath, subpool)); + } + else conflicted = FALSE; } } @@ -3184,8 +3250,8 @@ fb->local_abspath, subpool); if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND) { - svn_error_clear(err); - is_file_external = FALSE; + svn_error_clear(err); + is_file_external = FALSE; } else SVN_ERR(err); @@ -3234,13 +3300,15 @@ /* If we are skipping an add, we need to tell the WC that * there's a node supposed to be here which we don't have. */ - SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db, fb->local_abspath, - fb->new_relpath, - eb->repos_root, - eb->repos_uuid, - *eb->target_revision, - svn_wc__db_kind_file, - NULL, NULL, subpool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_base_add_not_present_node(eb->db, + fb->local_abspath, + fb->new_relpath, + eb->repos_root, + eb->repos_uuid, + *eb->target_revision, + svn_wc__db_kind_file, + NULL, NULL, subpool)); SVN_ERR(remember_skipped_tree(eb, fb->local_abspath)); /* Mark a conflict */ @@ -3258,10 +3326,11 @@ { fb->obstruction_found = TRUE; - SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, - fb->local_abspath, - tree_conflict, - subpool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, + fb->local_abspath, + tree_conflict, + subpool)); fb->already_notified = TRUE; do_notification(eb, fb->local_abspath, svn_node_unknown, @@ -3347,9 +3416,10 @@ /* Is this path the victim of a newly-discovered tree conflict? */ if (tree_conflict) { - SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, - fb->local_abspath, - tree_conflict, subpool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, + fb->local_abspath, + tree_conflict, subpool)); if (tree_conflict->reason == svn_wc_conflict_reason_deleted || tree_conflict->reason == svn_wc_conflict_reason_replaced) @@ -3405,24 +3475,31 @@ check our RECORDED_BASE_CHECKSUM. (In WC-1, we could not do this test for replaced nodes because we didn't store the checksum of the "revert base". In WC-NG, we do and we can.) */ - { - const svn_checksum_t *checksum; + if (fb->edit_baton->dry_run && + apr_hash_get(fb->edit_baton->dry_run_deletions, + fb->local_abspath, APR_HASH_KEY_STRING)) + { + recorded_base_checksum = NULL; + } + else + { + const svn_checksum_t *checksum; + + SVN_ERR(svn_wc__get_ultimate_base_checksums(NULL, &checksum, + fb->edit_baton->db, + fb->local_abspath, + pool, pool)); + recorded_base_checksum = svn_checksum_to_cstring(checksum, pool); + if (recorded_base_checksum && expected_base_checksum + && strcmp(expected_base_checksum, recorded_base_checksum) != 0) + return svn_error_createf(SVN_ERR_WC_CORRUPT_TEXT_BASE, NULL, + _("Checksum mismatch for '%s':\n" + " expected: %s\n" + " recorded: %s\n"), + svn_dirent_local_style(fb->local_abspath, pool), + expected_base_checksum, recorded_base_checksum); + } - SVN_ERR(svn_wc__get_ultimate_base_checksums(NULL, &checksum, - fb->edit_baton->db, - fb->local_abspath, - pool, pool)); - recorded_base_checksum = svn_checksum_to_cstring(checksum, pool); - if (recorded_base_checksum && expected_base_checksum - && strcmp(expected_base_checksum, recorded_base_checksum) != 0) - return svn_error_createf(SVN_ERR_WC_CORRUPT_TEXT_BASE, NULL, - _("Checksum mismatch for '%s':\n" - " expected: %s\n" - " recorded: %s\n"), - svn_dirent_local_style(fb->local_abspath, pool), - expected_base_checksum, recorded_base_checksum); - } - /* Open the text base for reading, unless this is an added file. */ /* @@ -3846,7 +3923,7 @@ fb->local_abspath, NULL /* copyfrom_abspath */, oldrev_str, newrev_str, mine_str, - FALSE /* dry_run */, + eb->dry_run, eb->diff3_cmd, NULL, fb->propchanges, eb->conflict_func, eb->conflict_baton, eb->cancel_func, eb->cancel_baton, @@ -3864,7 +3941,7 @@ } /* end: working file exists and has mods */ } /* end: working file has mods */ } /* end: "textual" merging process */ - else + else if (! eb->dry_run) { /* There is no new text base, but let's see if the working file needs to be updated for any other reason. */ @@ -3935,10 +4012,11 @@ /* If this would have been an obstruction, we wouldn't be here, because we would have installed an obstruction or tree conflict instead */ - SVN_ERR(svn_wc__wq_build_record_fileinfo(&work_item, - fb->local_abspath, - set_date, - pool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__wq_build_record_fileinfo(&work_item, + fb->local_abspath, + set_date, + pool)); *work_items = svn_wc__wq_merge(*work_items, work_item, pool); } @@ -4056,7 +4134,9 @@ if (! strcmp(prop->name, SVN_PROP_ENTRY_LOCK_TOKEN)) { SVN_ERR_ASSERT(prop->value == NULL); - SVN_ERR(svn_wc__db_lock_remove(eb->db, fb->local_abspath, pool)); + + if (! eb->dry_run) + SVN_ERR(svn_wc__db_lock_remove(eb->db, fb->local_abspath, pool)); lock_state = svn_wc_notify_lock_state_unlocked; break; @@ -4147,10 +4227,12 @@ svn_wc_conflict_action_add, svn_node_file, fb->new_relpath, pool)); SVN_ERR_ASSERT(tree_conflict != NULL); - SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, - fb->local_abspath, - tree_conflict, - scratch_pool)); + + if (! eb->dry_run) + SVN_ERR(svn_wc__db_op_set_tree_conflict(eb->db, + fb->local_abspath, + tree_conflict, + scratch_pool)); fb->already_notified = TRUE; do_notification(eb, fb->local_abspath, svn_node_unknown, @@ -4179,13 +4261,14 @@ current_actual_props, regular_props, /* propchanges */ TRUE /* base_merge */, - FALSE /* dry_run */, + eb->dry_run, eb->conflict_func, eb->conflict_baton, eb->cancel_func, eb->cancel_baton, pool, pool)); /* We will ALWAYS have properties to save (after a not-dry-run merge). */ - SVN_ERR_ASSERT(new_base_props != NULL && new_actual_props != NULL); + if (! eb->dry_run) + SVN_ERR_ASSERT(new_base_props != NULL && new_actual_props != NULL); /* Merge the text. This will queue some additional work. */ SVN_ERR(merge_file(&all_work_items, &install_pristine, &install_from, @@ -4203,13 +4286,14 @@ safety's sake). */ record_fileinfo = (install_from == NULL); - SVN_ERR(svn_wc__wq_build_file_install(&work_item, - eb->db, - fb->local_abspath, - install_from, - eb->use_commit_times, - record_fileinfo, - pool, pool)); + if ( !eb->dry_run) + SVN_ERR(svn_wc__wq_build_file_install(&work_item, + eb->db, + fb->local_abspath, + install_from, + eb->use_commit_times, + record_fileinfo, + pool, pool)); all_work_items = svn_wc__wq_merge(all_work_items, work_item, pool); } } @@ -4236,7 +4320,7 @@ no_working_props, regular_props, /* propchanges */ TRUE /* base_merge */, - FALSE /* dry_run */, + eb->dry_run, eb->conflict_func, eb->conflict_baton, eb->cancel_func, eb->cancel_baton, pool, @@ -4256,9 +4340,10 @@ might need to set the file read-only. Note: this will also update the executable flag, but ... meh. */ - SVN_ERR(svn_wc__wq_build_sync_file_flags(&work_item, eb->db, - fb->local_abspath, - pool, pool)); + if ( !eb->dry_run) + SVN_ERR(svn_wc__wq_build_sync_file_flags(&work_item, eb->db, + fb->local_abspath, + pool, pool)); all_work_items = svn_wc__wq_merge(all_work_items, work_item, pool); } @@ -4306,7 +4391,8 @@ eb->db, fb->local_abspath, pool, pool)); - SVN_ERR(svn_wc__db_base_add_file(eb->db, fb->local_abspath, + if (! eb->dry_run) + SVN_ERR(svn_wc__db_base_add_file(eb->db, fb->local_abspath, fb->new_relpath, eb->repos_root, eb->repos_uuid, *eb->target_revision, @@ -4336,37 +4422,41 @@ &file_external_rev, serialised, pool)); - SVN_ERR(svn_wc__db_temp_op_set_file_external( - eb->db, fb->local_abspath, - file_external_repos_relpath, - &file_external_peg_rev, - &file_external_rev, - pool)); + if (! eb->dry_run) + SVN_ERR(svn_wc__db_temp_op_set_file_external( + eb->db, fb->local_abspath, + file_external_repos_relpath, + &file_external_peg_rev, + &file_external_rev, + pool)); } } /* Deal with the WORKING tree, based on updates to the BASE tree. */ - /* If this file was locally-added and is now being added by the update, we - can toss the local-add, turning this into a local-edit. */ - if (fb->add_existed && fb->adding_file) + if (! eb->dry_run) { - SVN_ERR(svn_wc__db_temp_op_remove_working(eb->db, fb->local_abspath, + /* If this file was locally-added and is now being added by the update, we + can toss the local-add, turning this into a local-edit. */ + if (fb->add_existed && fb->adding_file) + { + SVN_ERR(svn_wc__db_temp_op_remove_working(eb->db, fb->local_abspath, pool)); - } + } - /* Now we need to update the ACTUAL tree, with the result of the - properties merge. */ - if (! fb->adding_base_under_local_add) - { - SVN_ERR_ASSERT(new_actual_props != NULL); + /* Now we need to update the ACTUAL tree, with the result of the + properties merge. */ + if (! fb->adding_base_under_local_add) + { + SVN_ERR_ASSERT(new_actual_props != NULL); - SVN_ERR(svn_wc__db_op_set_props(eb->db, fb->local_abspath, - new_actual_props, - NULL /* conflict */, - NULL /* work_item */, - pool)); - } + SVN_ERR(svn_wc__db_op_set_props(eb->db, fb->local_abspath, + new_actual_props, + NULL /* conflict */, + NULL /* work_item */, + pool)); + } + } /* ### we may as well run whatever is in the queue right now. this ### starts out with some crap node data via construct_base_node(), @@ -4393,7 +4483,11 @@ action = svn_wc_notify_update_add_deleted; else if (fb->obstruction_found || fb->add_existed) { - if (content_state != svn_wc_notify_state_conflicted) + if (fb->edit_baton->dry_run + && apr_hash_get(fb->edit_baton->dry_run_deletions, + fb->local_abspath, APR_HASH_KEY_STRING)) + action = svn_wc_notify_update_add; + else if (content_state != svn_wc_notify_state_conflicted) action = svn_wc_notify_exists; } else if (fb->adding_file) @@ -4409,10 +4503,16 @@ notify->revision = *eb->target_revision; notify->old_revision = fb->old_revision; - /* Fetch the mimetype */ - SVN_ERR(svn_wc__internal_propget(&mime_type, eb->db, fb->local_abspath, - SVN_PROP_MIME_TYPE, pool, pool)); - notify->mime_type = mime_type == NULL ? NULL : mime_type->data; + if (! eb->dry_run) + { + /* Fetch the mimetype */ + SVN_ERR(svn_wc__internal_propget(&mime_type, eb->db, + fb->local_abspath, + SVN_PROP_MIME_TYPE, pool, pool)); + notify->mime_type = mime_type == NULL ? NULL : mime_type->data; + } + else + notify->mime_type = NULL; eb->notify_func(eb->notify_baton, notify, pool); } @@ -4670,16 +4770,16 @@ */ static svn_error_t * do_update_cleanup(svn_wc__db_t *db, - const char *local_abspath, - svn_depth_t depth, - const char *new_repos_relpath, - const char *new_repos_root_url, - const char *new_repos_uuid, - svn_revnum_t new_revision, - svn_wc_notify_func2_t notify_func, - void *notify_baton, - apr_hash_t *exclude_paths, - apr_pool_t *pool) + const char *local_abspath, + svn_depth_t depth, + const char *new_repos_relpath, + const char *new_repos_root_url, + const char *new_repos_uuid, + svn_revnum_t new_revision, + svn_wc_notify_func2_t notify_func, + void *notify_baton, + apr_hash_t *exclude_paths, + apr_pool_t *pool) { svn_wc__db_status_t status; svn_wc__db_kind_t kind; @@ -4768,7 +4868,7 @@ /* Extra check: if the update did nothing but make its target 'deleted', then do *not* run cleanup on the target, as it will only remove the deleted entry! */ - if (! eb->target_deleted) + if ((! eb->target_deleted) && (! eb->dry_run)) { SVN_ERR(do_update_cleanup(eb->db, eb->target_abspath, @@ -4809,6 +4909,7 @@ svn_depth_t depth, svn_boolean_t depth_is_sticky, svn_boolean_t allow_unver_obstructions, + svn_boolean_t dry_run, svn_wc_notify_func2_t notify_func, void *notify_baton, svn_cancel_func_t cancel_func, @@ -4863,7 +4964,6 @@ eb->wc_ctx = wc_ctx; eb->target_basename = target_basename; eb->anchor_abspath = anchor_abspath; - if (switch_url) eb->switch_relpath = svn_path_uri_decode(svn_uri_skip_ancestor(repos_root, switch_url), @@ -4890,7 +4990,9 @@ eb->conflict_baton = conflict_baton; eb->allow_unver_obstructions = allow_unver_obstructions; eb->skipped_trees = apr_hash_make(edit_pool); + eb->dry_run_deletions = apr_hash_make(edit_pool); eb->ext_patterns = preserved_exts; + eb->dry_run = dry_run; /* Construct an editor. */ tree_editor->set_target_revision = set_target_revision; @@ -4955,6 +5057,7 @@ svn_depth_t depth, svn_boolean_t depth_is_sticky, svn_boolean_t allow_unver_obstructions, + svn_boolean_t dry_run, const char *diff3_cmd, const apr_array_header_t *preserved_exts, svn_wc_conflict_resolver_func_t conflict_func, @@ -4971,7 +5074,7 @@ return make_editor(target_revision, wc_ctx, anchor_abspath, target_basename, use_commit_times, NULL, depth, depth_is_sticky, allow_unver_obstructions, - notify_func, notify_baton, + dry_run, notify_func, notify_baton, cancel_func, cancel_baton, conflict_func, conflict_baton, external_func, external_baton, @@ -5010,6 +5113,7 @@ target_basename, use_commit_times, switch_url, depth, depth_is_sticky, allow_unver_obstructions, + FALSE /* dry_run */, notify_func, notify_baton, cancel_func, cancel_baton, conflict_func, conflict_baton, Index: subversion/libsvn_wc/adm_crawler.c =================================================================== --- subversion/libsvn_wc/adm_crawler.c (revision 1075841) +++ subversion/libsvn_wc/adm_crawler.c (working copy) @@ -166,22 +166,25 @@ const char *local_abspath, svn_wc__db_kind_t kind, svn_boolean_t use_commit_times, + svn_boolean_t dry_run, svn_wc_notify_func2_t notify_func, void *notify_baton, apr_pool_t *scratch_pool) { - if (kind == svn_wc__db_kind_file || kind == svn_wc__db_kind_symlink) + if (! dry_run) { - /* Recreate file from text-base */ - SVN_ERR(restore_file(db, local_abspath, use_commit_times, TRUE, - scratch_pool)); + if (kind == svn_wc__db_kind_file || kind == svn_wc__db_kind_symlink) + { + /* Recreate file from text-base */ + SVN_ERR(restore_file(db, local_abspath, use_commit_times, TRUE, + scratch_pool)); + } + else if (kind == svn_wc__db_kind_dir) + { + /* Recreating a directory is just a mkdir */ + SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT, scratch_pool)); + } } - else if (kind == svn_wc__db_kind_dir) - { - /* Recreating a directory is just a mkdir */ - SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT, scratch_pool)); - } - /* ... report the restoration to the caller. */ if (notify_func != NULL) { @@ -277,6 +280,7 @@ svn_wc_notify_func2_t notify_func, void *notify_baton, svn_boolean_t restore_files, + svn_boolean_t dry_run, svn_depth_t depth, svn_boolean_t honor_depth_exclude, svn_boolean_t depth_compatibility_trick, @@ -453,7 +457,8 @@ if (dirent_kind == svn_node_none) { SVN_ERR(restore_node(db, this_abspath, wrk_kind, - use_commit_times, notify_func, + use_commit_times, dry_run, + notify_func, notify_baton, iterpool)); } } @@ -650,7 +655,7 @@ reporter, report_baton, external_func, external_baton, notify_func, notify_baton, - restore_files, depth, + restore_files, dry_run, depth, honor_depth_exclude, depth_compatibility_trick, start_empty, @@ -736,6 +741,7 @@ const svn_ra_reporter3_t *reporter, void *report_baton, svn_boolean_t restore_files, + svn_boolean_t dry_run, svn_depth_t depth, svn_boolean_t honor_depth_exclude, svn_boolean_t depth_compatibility_trick, @@ -879,6 +885,7 @@ { SVN_ERR(restore_node(wc_ctx->db, local_abspath, target_kind, use_commit_times, + dry_run, notify_func, notify_baton, scratch_pool)); } @@ -903,7 +910,7 @@ reporter, report_baton, external_func, external_baton, notify_func, notify_baton, - restore_files, depth, + restore_files, dry_run, depth, honor_depth_exclude, depth_compatibility_trick, start_empty, Index: subversion/libsvn_client/switch.c =================================================================== --- subversion/libsvn_client/switch.c (revision 1075841) +++ subversion/libsvn_client/switch.c (working copy) @@ -212,7 +212,8 @@ externals of type '../path'. All of those must be resolved to the new location. */ err = svn_wc_crawl_revisions5(ctx->wc_ctx, local_abspath, reporter, - report_baton, TRUE, depth, (! depth_is_sticky), + report_baton, TRUE, FALSE, + depth, (! depth_is_sticky), (! server_supports_depth), use_commit_times, svn_client__external_info_gatherer, &efb, Index: subversion/libsvn_client/status.c =================================================================== --- subversion/libsvn_client/status.c (revision 1075841) +++ subversion/libsvn_client/status.c (working copy) @@ -494,7 +494,7 @@ SVN_ERR(svn_wc_crawl_revisions5(ctx->wc_ctx, target_abspath, &lock_fetch_reporter, &rb, FALSE, - depth, TRUE, + FALSE, depth, TRUE, (! server_supports_depth), FALSE, NULL, NULL, NULL, NULL, pool)); } Index: subversion/libsvn_client/diff.c =================================================================== --- subversion/libsvn_client/diff.c (revision 1075841) +++ subversion/libsvn_client/diff.c (working copy) @@ -1890,7 +1890,7 @@ diffs in reverse. :-) */ SVN_ERR(svn_wc_crawl_revisions5(ctx->wc_ctx, abspath2, reporter, reporter_baton, - FALSE, depth, TRUE, (! server_supports_depth), + FALSE, FALSE, depth, TRUE, (! server_supports_depth), FALSE, NULL, NULL, /* notification is N/A */ NULL, NULL, pool)); Index: subversion/libsvn_client/checkout.c =================================================================== --- subversion/libsvn_client/checkout.c (revision 1075841) +++ subversion/libsvn_client/checkout.c (working copy) @@ -218,7 +218,7 @@ ignore_externals, allow_unver_obstructions, use_sleep, innercheckout, FALSE, - ctx, pool); + FALSE, ctx, pool); } if (err) Index: subversion/libsvn_client/externals.c =================================================================== --- subversion/libsvn_client/externals.c (revision 1075841) +++ subversion/libsvn_client/externals.c (working copy) @@ -206,7 +206,7 @@ revision, svn_depth_unknown, FALSE, FALSE, FALSE, timestamp_sleep, TRUE, FALSE, - ctx, subpool)); + FALSE, ctx, subpool)); svn_pool_destroy(subpool); return SVN_NO_ERROR; } Index: subversion/tests/cmdline/svntest/actions.py =================================================================== --- subversion/tests/cmdline/svntest/actions.py (revision 1075841) +++ subversion/tests/cmdline/svntest/actions.py (working copy) @@ -769,6 +769,7 @@ singleton_handler_b = None, b_baton = None, check_props = False, + dry_run = True, *args): """Update WC_DIR_NAME. *ARGS are any extra optional args to the @@ -797,7 +798,51 @@ Return if successful, raise on failure.""" - # Update and make a tree of the output. + def _post_update_checks(error_re_string, errput, output, wc_dir_name, + output_tree, disk_tree, status_tree, + singleton_handler_a, a_baton, + singleton_handler_b, b_baton, + check_props): + if error_re_string: + rm = re.compile(error_re_string) + for line in errput: + match = rm.search(line) + if match: + return + raise main.SVNUnmatchedError + + actual = wc.State.from_checkout(output) + verify_update(actual, None, None, wc_dir_name, + output_tree, None, None, disk_tree, status_tree, + singleton_handler_a, a_baton, + singleton_handler_b, b_baton, + check_props) + + if dry_run: + pre_disk = tree.build_tree_from_wc(wc_dir_name) + if len(args): + exit_code, output, errput = main.run_svn(error_re_string, "up", + "--dry-run", *args) + else: + exit_code, output, errput = main.run_svn(error_re_string, + "up", "--dry-run", + wc_dir_name, *args) + post_disk = tree.build_tree_from_wc(wc_dir_name) + try: + tree.compare_trees("disk", post_disk, pre_disk) + except tree.SVNTreeError: + print("=============================================================") + print("Dry-run update altered working copy") + print("=============================================================") + raise + + _post_update_checks(error_re_string, errput, output, wc_dir_name, + output_tree, None, None, + singleton_handler_a, a_baton, + singleton_handler_b, b_baton, + check_props) + + # Update and make a tree of the output. if len(args): exit_code, output, errput = main.run_svn(error_re_string, 'up', *args) else: @@ -805,22 +850,12 @@ 'up', wc_dir_name, *args) - if error_re_string: - rm = re.compile(error_re_string) - for line in errput: - match = rm.search(line) - if match: - return - raise main.SVNUnmatchedError + _post_update_checks(error_re_string, errput, output, wc_dir_name, + output_tree, disk_tree, status_tree, + singleton_handler_a, a_baton, + singleton_handler_b, b_baton, + check_props) - actual = wc.State.from_checkout(output) - verify_update(actual, None, None, wc_dir_name, - output_tree, None, None, disk_tree, status_tree, - singleton_handler_a, a_baton, - singleton_handler_b, b_baton, - check_props) - - def run_and_parse_info(*args): """Run 'svn info' and parse its output into a list of dicts, one dict per target.""" @@ -1950,7 +1985,7 @@ expected_status = get_virginal_state(wc_dir, 1) run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) # Make local changes main.run_svn(None, 'del', pi) Index: subversion/tests/cmdline/changelist_tests.py =================================================================== --- subversion/tests/cmdline/changelist_tests.py (revision 1075841) +++ subversion/tests/cmdline/changelist_tests.py (working copy) @@ -810,7 +810,7 @@ expected_status, None, None, None, None, None, 1, - "-r", "1", + True, "-r", "1", "--changelist", "a", "--changelist", "i", "--depth", "files", @@ -852,7 +852,7 @@ expected_status, None, None, None, None, None, 1, - "-r", "1", + True, "-r", "1", "--changelist", "a", "--changelist", "i", "--changelist", "o", Index: subversion/tests/cmdline/externals_tests.py =================================================================== --- subversion/tests/cmdline/externals_tests.py (revision 1075841) +++ subversion/tests/cmdline/externals_tests.py (working copy) @@ -1159,7 +1159,7 @@ expected_disk, expected_status, None, None, None, None, None, - True) + True, False) #---------------------------------------------------------------------- @@ -1205,7 +1205,7 @@ expected_disk, expected_status, None, None, None, None, None, - True) + True, False) # now remove the svn:external prop svntest.actions.run_and_verify_svn(None, None, [], @@ -1238,7 +1238,7 @@ expected_disk, expected_status, None, None, None, None, None, - True) + True, False) #---------------------------------------------------------------------- @@ -1369,7 +1369,7 @@ expected_disk, expected_status, None, None, None, None, None, - True) + True, False) ### TODO: Commit the propset and update a pristine working copy from ### r2 to r3. @@ -1440,7 +1440,7 @@ expected_disk, expected_status, None, None, None, None, None, - True) + True, False) # Copy A/C to a new tag in the repos tag_url = repo_url + '/A/I' @@ -1474,7 +1474,7 @@ expected_disk, expected_status, None, None, None, None, None, - True) + True, False) #---------------------------------------------------------------------- def merge_target_with_externals(sbox): @@ -1543,7 +1543,7 @@ expected_disk, expected_status, None, None, None, None, None, - True) + True, False) # Modify A/mu svntest.main.file_append(sbox.ospath('A/mu'), 'appended mu text') @@ -1573,7 +1573,7 @@ expected_disk, expected_status, None, None, None, None, None, - True) + True, False) # Test for issue #2267 @Issue(2267) Index: subversion/tests/cmdline/prop_tests.py =================================================================== --- subversion/tests/cmdline/prop_tests.py (revision 1075841) +++ subversion/tests/cmdline/prop_tests.py (working copy) @@ -198,7 +198,7 @@ expected_disk, expected_status, None, None, None, None, None, 1, - '-r', '2', wc_backup) + True, '-r', '2', wc_backup) # This adds properties to nodes that have properties expected_status.tweak(wc_rev=3) @@ -211,7 +211,7 @@ expected_disk, expected_status, None, None, None, None, None, 1, - '-r', '3', wc_backup) + True, '-r', '3', wc_backup) #---------------------------------------------------------------------- @@ -278,7 +278,7 @@ expected_disk, expected_status, None, None, None, None, None, 1, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) #---------------------------------------------------------------------- Index: subversion/tests/cmdline/update_tests.py =================================================================== --- subversion/tests/cmdline/update_tests.py (revision 1075841) +++ subversion/tests/cmdline/update_tests.py (working copy) @@ -302,7 +302,7 @@ expected_status, None, None, None, None, None, 1, - '-r', '2', wc_dir) + True, '-r', '2', wc_dir) #---------------------------------------------------------------------- @@ -359,7 +359,7 @@ expected_disk, expected_status, None, None, None, None, None, 0, - mu_path, rho_path, + True, mu_path, rho_path, E_path, H_path) #---------------------------------------------------------------------- @@ -448,7 +448,7 @@ expected_disk, None, None, None, None, None, None, 0, - '-r', '0', wc_dir) + True, '-r', '0', wc_dir) #---------------------------------------------------------------------- @@ -820,7 +820,7 @@ }) actions.run_and_verify_update(wc_dir, expected_output, expected_disk, - expected_status, None, None, None, None, None, False, wc_dir) + expected_status, None, None, None, None, None, False, True, wc_dir) # Remove the file which caused the obstruction. @@ -1109,7 +1109,7 @@ expected_disk, expected_status, None, None, None, None, None, - 0, "-r", "2", E_path, H_path) + 0, True, "-r", "2", E_path, H_path) # Update back to the old revision again svntest.main.run_svn(None, @@ -1130,7 +1130,7 @@ expected_disk, expected_status, None, None, None, None, None, - 0, "-r", "2", wc_dir) + 0, True, "-r", "2", wc_dir) #---------------------------------------------------------------------- @@ -1253,7 +1253,7 @@ expected_disk, expected_status, None, None, None, None, None, 0, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) @@ -1332,7 +1332,7 @@ svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, None, None, None, None, 0, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) # Non-recursive update of A should change A/mu but not A/D/G/rho A_path = os.path.join(wc_dir, 'A') @@ -1348,7 +1348,7 @@ svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, None, None, None, None, 0, - '-N', A_path) + True, '-N', A_path) #---------------------------------------------------------------------- @@ -1394,7 +1394,7 @@ expected_disk, None, None, None, None, None, None, 0, - '-r', '0', iota_path) + True, '-r', '0', iota_path) # Update the wc root, so iota comes back. expected_output = svntest.wc.State(wc_dir, { @@ -1408,7 +1408,7 @@ expected_disk, None, None, None, None, None, None, 0, - wc_dir) + True, wc_dir) #---------------------------------------------------------------------- @@ -1533,7 +1533,7 @@ expected_disk, None, None, None, None, None, None, 0, - '-r', '0', wc_dir) + True, '-r', '0', wc_dir) # Update iota to the current HEAD. iota_path = os.path.join(wc_dir, 'iota') @@ -1551,7 +1551,7 @@ expected_disk, None, None, None, None, None, None, 0, - iota_path) + True, iota_path) # Now try updating the directory into the future A_path = os.path.join(wc_dir, 'A') @@ -1585,7 +1585,7 @@ expected_disk, None, None, None, None, None, None, 0, - A_path); + True, A_path); #---------------------------------------------------------------------- @@ -1681,7 +1681,7 @@ expected_disk, expected_status, None, None, None, None, None, 0, - '-r', '2', B_path) + True, '-r', '2', B_path) finally: os.chmod(os.path.join(wc_dir, 'A', svntest.main.get_admin_name()), 0777) @@ -2149,7 +2149,7 @@ expected_disk, expected_status, None, None, None, None, None, 0, - wc_backup, '--force') + True, wc_backup, '--force') #---------------------------------------------------------------------- def forced_update_failures(sbox): @@ -2224,7 +2224,7 @@ actions.run_and_verify_update(wc_backup, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - '--force', backup_A_B_F) + True, '--force', backup_A_B_F) # A forced update that tries to add a directory when an unversioned file @@ -2267,7 +2267,7 @@ actions.run_and_verify_update(wc_dir_backup, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - '--force', backup_A_C) + True, '--force', backup_A_C) # rm -rf wc_dir_backup/A/C/I wc_dir_backup/A/B/F/nu os.remove(backup_A_C_I) @@ -2287,7 +2287,7 @@ actions.run_and_verify_update(wc_dir_backup, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - wc_dir_backup) + True, wc_dir_backup) # svn up -r1 wc_dir_backup/A/C expected_output = svntest.wc.State(wc_dir_backup, { @@ -2301,7 +2301,7 @@ actions.run_and_verify_update(wc_dir_backup, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - '-r1', backup_A_C) + True, '-r1', backup_A_C) # svn co url/A/C/I wc_dir_backup/A/C/I expected_output = svntest.wc.State(wc_dir_backup, {}) @@ -2318,7 +2318,7 @@ ) actions.run_and_verify_update(wc_dir_backup, None, None, None, - expected_error, None, None, None, None, False, '--force', backup_A_C) + expected_error, None, None, None, None, False, True, '--force', backup_A_C) #---------------------------------------------------------------------- @@ -2439,7 +2439,7 @@ expected_disk, expected_status, None, None, None, None, None, 0, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) os.chdir(was_cwd) @@ -2548,7 +2548,7 @@ expected_status, None, None, None, None, None, 0, - wc_dir, '-r1') + True, wc_dir, '-r1') svntest.main.run_svn(None, 'rm', iota_path) svntest.main.run_svn(None, 'cp', mu_path, iota_path) @@ -2810,6 +2810,7 @@ # Perform forced update and check the results in three # ways (including props). + svntest.actions.run_and_verify_update(wc_backup, expected_output, expected_disk, @@ -2817,7 +2818,7 @@ None, svntest.tree.detect_conflict_files, extra_files, None, None, 1, - wc_backup) + True, wc_backup) # Some obstructions are still not permitted: # @@ -2918,7 +2919,7 @@ svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - A_path) + True, A_path) # Resolve the tree conflict. svntest.main.run_svn(None, 'resolve', '--accept', 'working', M_path) @@ -2927,7 +2928,7 @@ svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - M_path, '--force') + True, M_path, '--force') # Try to update omicron's parent, non-recusively so as not to # try and update M first. @@ -2942,7 +2943,7 @@ svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - wc_dir, '-N') + True, wc_dir, '-N') # Resolve the tree conflict. svntest.main.run_svn(None, 'resolved', omicron_path) @@ -2955,7 +2956,7 @@ svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - omicron_path, '-N', '--force') + True, omicron_path, '-N', '--force') # Test for issue #2022: Update shouldn't touch conflicted files. def update_conflicted(sbox): @@ -3031,7 +3032,7 @@ None, None, None, None, None, 1, - '-r1', wc_dir) + True, '-r1', wc_dir) # Create modifications conflicting with rev 2. svntest.main.file_append(iota_path, 'Conflicting appended text for iota\n') @@ -3084,7 +3085,7 @@ None, detect_extra_files, extra_files, None, None, 1, - '-r2', wc_dir) + True, '-r2', wc_dir) # Now, update to HEAD, which should skip all the conflicted files, but # still update the pi file. @@ -3289,7 +3290,7 @@ expected_status, None, None, None, None, None, 1, - '-r', '5', wc_dir) + True, '-r', '5', wc_dir) # Merge r2:5 to A/B_COPY/E/alpha expected_output = wc.State(alpha_COPY_path, { @@ -3433,7 +3434,7 @@ expected_status, None, None, None, None, None, 1, - '-r', '7', E_COPY_path) + True, '-r', '7', E_COPY_path) # Merge r6:7 to A/B_COPY expected_output = wc.State(B_COPY_path, { @@ -3505,7 +3506,7 @@ expected_disk, expected_status, None, None, None, - None, None, 1, E_COPY_path) + None, None, 1, True, E_COPY_path) #---------------------------------------------------------------------- @@ -3591,14 +3592,14 @@ # Create expected disk tree for the update to rev 0 expected_disk = svntest.main.greek_state.copy() - + # Do the update and check the results. svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, None, None, None, None, None, None, 0, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) # And back up to 3 again. expected_output = svntest.wc.State(wc_dir, { @@ -3623,7 +3624,7 @@ expected_disk, expected_status, None, None, None, None, None, 0, - wc_dir) + True, wc_dir) #---------------------------------------------------------------------- # Regression test: ra_neon assumes that you never delete a property on @@ -3702,7 +3703,7 @@ expected_status_r2, None, None, None, None, None, True, - "-r2", wc_dir) + True, "-r2", wc_dir) # And finally, back to r3, getting an add-with-history-and-property-deleted expected_output = svntest.wc.State(wc_dir, {'iota2': Item(status='A ')}) @@ -3993,7 +3994,7 @@ None, None, None, None, None, 1, - '-r1', wc_dir) + True, '-r1', wc_dir) # Modify iota differently and try to update *with the interactive # resolver*. ### The parser won't go so well with the output @@ -4001,7 +4002,7 @@ svntest.actions.run_and_verify_update(wc_dir, None, None, None, "Can't read stdin: End of file found", None, None, None, None, 1, - wc_dir, '--config-dir', config_dir) + False, wc_dir, '--config-dir', config_dir) # Now update -r1 again. Hopefully we don't get a checksum error! expected_output = svntest.wc.State(wc_dir, {}) @@ -4020,7 +4021,7 @@ None, None, None, None, None, 1, - '-r1', wc_dir) + True, '-r1', wc_dir) #---------------------------------------------------------------------- @@ -4129,7 +4130,7 @@ }) actions.run_and_verify_update(wc_dir, expected_output, expected_disk, - expected_status, None, None, None, None, None, False, wc_dir) + expected_status, None, None, None, None, None, False, True, wc_dir) # Now, delete the obstructing path and rerun the update. os.unlink(zeta_path) @@ -5018,7 +5019,7 @@ expected_status, None, None, None, None, None, 1, - '--set-depth', 'empty', + False, '--set-depth', 'empty', B_path) expected_output = svntest.wc.State(wc_dir, { @@ -5050,7 +5051,7 @@ expected_status, None, None, None, None, None, 1, - '--set-depth', 'immediates', + False, '--set-depth', 'immediates', D_path) # Now update A with --set-depth infinity. All the subtrees we @@ -5079,7 +5080,7 @@ expected_status, None, None, None, None, None, 1, - '--set-depth', 'infinity', + False, '--set-depth', 'infinity', A_path) #---------------------------------------------------------------------- @@ -5174,7 +5175,7 @@ expected_status_empty, None, None, None, None, None, 1, - '-r', '0', + True, '-r', '0', wc_dir) # Now update back to HEAD @@ -5184,7 +5185,7 @@ expected_status, None, None, None, None, None, 1, - wc_dir) + True, wc_dir) # Update to revision 0 - Removes all files from WC svntest.actions.run_and_verify_update(wc_dir, @@ -5193,7 +5194,7 @@ expected_status_empty, None, None, None, None, None, 1, - '-r', '0', + True, '-r', '0', wc_dir) # Update the directory itself back to HEAD @@ -5203,7 +5204,7 @@ expected_status_empty, None, None, None, None, None, 1, - '--depth', 'empty', + True, '--depth', 'empty', wc_dir) # Now update the rest back to head @@ -5217,7 +5218,7 @@ expected_status, None, None, None, None, None, 1, - wc_dir) + True, wc_dir) #---------------------------------------------------------------------- # Test for issue #3573 'local non-inheritable mergeinfo changes not @@ -5297,7 +5298,7 @@ svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - '--set-depth=exclude', G) + False, '--set-depth=exclude', G) # Commit a new revision so there is something to update to. svntest.main.run_svn(None, 'mkdir', '-m', '', sbox.repo_url + '/New') Index: subversion/tests/cmdline/resolved_tests.py =================================================================== --- subversion/tests/cmdline/resolved_tests.py (revision 1075841) +++ subversion/tests/cmdline/resolved_tests.py (working copy) @@ -95,7 +95,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - '-r1', wc) + True, '-r1', wc) # Deletions so that the item becomes unversioned and # will have a tree-conflict upon update. @@ -127,7 +127,7 @@ expected_disk, None, None, None, None, None, None, False, - wc) + True, wc) svntest.actions.run_and_verify_unquiet_status(wc, expected_status) # Resolve recursively @@ -230,7 +230,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - wc) + True, wc) # Create some conflicts... Index: subversion/tests/cmdline/trans_tests.py =================================================================== --- subversion/tests/cmdline/trans_tests.py (revision 1075841) +++ subversion/tests/cmdline/trans_tests.py (working copy) @@ -526,7 +526,7 @@ None, None, do_nothing, None, None, None, - 0, '-r', '1', wc_dir) + 0, True, '-r', '1', wc_dir) #---------------------------------------------------------------------- @@ -849,7 +849,7 @@ None, None, expected_status, None, None, None, None, None, - False, + False, True, wc_dir, '-r', '2') if open(iota_path).read() != ''.join(content_expanded): @@ -865,7 +865,7 @@ None, expected_disk, expected_status, None, None, None, None, None, - False, + False, True, wc_dir) if open(iota_path).read() != ''.join(content): Index: subversion/tests/cmdline/switch_tests.py =================================================================== --- subversion/tests/cmdline/switch_tests.py (revision 1075841) +++ subversion/tests/cmdline/switch_tests.py (working copy) @@ -378,7 +378,7 @@ expected_status, None, None, None, None, None, 1, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) #---------------------------------------------------------------------- @@ -435,7 +435,7 @@ expected_disk, expected_status, None, None, None, - None, None, 0, + None, None, 0, True, B_path, iota_path) @@ -493,7 +493,7 @@ expected_disk, expected_status, None, None, None, - None, None, 1, + None, None, 1, True, '-r', '1', B_path, iota_path) @@ -903,7 +903,7 @@ expected_status.tweak('A/Z', treeconflict=None) actions.run_and_verify_update(wc_dir, expected_output, expected_disk, - expected_status, None, None, None, None, None, False, wc_dir) + expected_status, None, None, None, None, None, False, True, wc_dir) @@ -1598,7 +1598,7 @@ expected_status.tweak('A/D/G', switched='S') actions.run_and_verify_update(wc_dir, expected_output, expected_disk, - expected_status, None, None, None, None, None, False, wc_dir) + expected_status, None, None, None, None, None, False, True, wc_dir) def switch_with_obstructing_local_adds(sbox): Index: subversion/tests/cmdline/stat_tests.py =================================================================== --- subversion/tests/cmdline/stat_tests.py (revision 1075841) +++ subversion/tests/cmdline/stat_tests.py (working copy) @@ -741,7 +741,7 @@ svntest.actions.run_and_verify_update(other_wc, expected_output, expected_disk, expected_status, None, None, None, None, None, False, - other_wc, '--config-dir', config_dir) + True, other_wc, '--config-dir', config_dir) iota_text_timestamp = get_text_timestamp(other_iota_path) if (iota_text_timestamp[17] != ':' or iota_text_timestamp[17:] != iota_last_changed[17:]): @@ -1177,7 +1177,7 @@ expected_disk, expected_status, None, None, None, None, None, 1, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) # Can't use run_and_verify_status here because the out-of-date # information in the status output isn't copied in the status tree. @@ -1313,7 +1313,7 @@ expected_disk, expected_status, None, None, None, None, None, 1, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) # Can't use run_and_verify_status here because the out-of-date # information in the status output isn't copied in the status tree. @@ -1391,7 +1391,7 @@ expected_disk, expected_status, None, None, None, None, None, 0, - '-r', '1', wc_dir) + True, '-r', '1', wc_dir) # Check the remote status of folder A (non-recursively) xout = [" * 1 " + os.path.join(wc_dir, "A", "mu") + "\n", Index: subversion/tests/cmdline/depth_tests.py =================================================================== --- subversion/tests/cmdline/depth_tests.py (revision 1075841) +++ subversion/tests/cmdline/depth_tests.py (working copy) @@ -211,7 +211,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - "--depth=infinity", wc_empty) + True, "--depth=infinity", wc_empty) # And the wc should still be depth-empty. verify_depth(None, "empty", wc_empty) @@ -352,7 +352,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - '-r2', wc_empty) + True, '-r2', wc_empty) # Update the depth-empty wc all the way, expecting to receive the deletion # of iota. @@ -411,7 +411,7 @@ expected_status, None, None, None, None, None, None, - A_path) + True, A_path) # Commit a change to A/mu in the "other" wc. svntest.main.file_write(other_mu_path, "new text\n") @@ -438,7 +438,7 @@ expected_status, None, None, None, None, None, None, - A_path) + True, A_path) # Commit the deletion of A/mu from the "other" wc. svntest.main.file_write(other_mu_path, "new text\n") @@ -467,7 +467,7 @@ expected_status, None, None, None, None, None, None, - A_path) + True, A_path) @@ -501,7 +501,7 @@ expected_status, None, None, None, None, None, None, - A_mu_path) + True, A_mu_path) # Run 'svn up A/D/gamma' to test the edge case 'Skipped'. expected_output = svntest.wc.State(wc_imm, { @@ -523,7 +523,7 @@ expected_status, None, None, None, None, None, None, - gamma_path) + True, gamma_path) #---------------------------------------------------------------------- def depth_immediates_fill_in_dir(sbox): @@ -561,7 +561,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'infinity', A_path) @@ -595,7 +595,7 @@ expected_status, None, None, None, None, None, None, - '--set-depth', 'files', + False, '--set-depth', 'files', A_path) # Check that A was added at depth=files. verify_depth(None, "files", A_path) @@ -623,7 +623,7 @@ expected_status, None, None, None, None, None, None, - '--set-depth', 'immediates', + False, '--set-depth', 'immediates', B_path) # Check that A/B was added at depth=immediates. verify_depth(None, "immediates", B_path) @@ -648,7 +648,7 @@ expected_status, None, None, None, None, None, None, - '--set-depth', 'empty', + False, '--set-depth', 'empty', C_path) # Check that A/C was added at depth=empty. verify_depth(None, "empty", C_path) @@ -867,7 +867,7 @@ expected_status, None, None, None, None, None, None, - '--set-depth', 'files') + False, '--set-depth', 'files') verify_depth(None, "files") # Run 'svn up --set-depth=immediates' in the now depth-files working copy. @@ -888,7 +888,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates') verify_depth(None, "immediates") verify_depth(None, "empty", "A") @@ -913,7 +913,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'files', 'A') verify_depth(None, "immediates") verify_depth(None, "files", "A") @@ -945,7 +945,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'infinity') verify_depth("Non-infinity depth detected after an upgrade to depth-infinity", "infinity") @@ -1320,7 +1320,7 @@ expected_disk, expected_status, None, None, None, None, None, None, - '--set-depth=files') + False, '--set-depth=files') verify_depth(None, "files") finally: os.chdir(saved_cwd) @@ -1342,7 +1342,7 @@ expected_disk, expected_status, None, None, None, None, None, None, - '--set-depth=files', wc) + False, '--set-depth=files', wc) verify_depth(None, "files", wc) def status_in_depthy_wc(sbox): @@ -1484,7 +1484,7 @@ expected_disk, expected_status_func(wc_dir), None, None, None, None, None, - False, + False, True, "--depth=%s" % depth, wc_dir) @@ -1530,7 +1530,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', E_path) verify_depth(None, "immediates", E_path) @@ -1541,7 +1541,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'files', E_path) verify_depth(None, "files", E_path) @@ -1558,7 +1558,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', B_path) verify_depth(None, "immediates", B_path) verify_depth(None, "empty", E_path) @@ -1578,7 +1578,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'empty', H_path) verify_depth(None, "empty", H_path) @@ -1596,7 +1596,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', D_path) verify_depth(None, "immediates", D_path) verify_depth(None, "empty", G_path) @@ -1615,7 +1615,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'empty', D_path) verify_depth(None, "empty", D_path) @@ -1633,7 +1633,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', A_path) verify_depth(None, "immediates", A_path) verify_depth(None, "empty", C_path) @@ -1653,7 +1653,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'files', A_path) verify_depth(None, "files", A_path) @@ -1669,7 +1669,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'empty', A_path) verify_depth(None, "empty", A_path) @@ -1685,7 +1685,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'files', wc_dir) verify_depth(None, "files", wc_dir) @@ -1757,7 +1757,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', D_path) verify_depth(None, "immediates", D_path) verify_depth(None, "empty", G_path) @@ -1777,7 +1777,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', A_path) verify_depth(None, "immediates", A_path) verify_depth(None, "empty", D_path) @@ -1798,7 +1798,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', A_path) verify_depth(None, "immediates", A_path) verify_depth(None, "empty", D_path) @@ -1817,7 +1817,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', A_path) verify_depth(None, "immediates", A_path) verify_depth(None, "empty", D_path) @@ -1844,7 +1844,7 @@ # expected_disk, # expected_status, # None, None, -# None, None, None, None, +# None, None, None, None, False, # '--set-depth', 'empty', A_path) def depth_fold_expand_clean_trees(sbox): @@ -1902,7 +1902,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', A_path) verify_depth(None, "immediates", A_path) verify_depth(None, "empty", B_path) @@ -1930,7 +1930,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'files', Other_A_path) verify_depth(None, "files", Other_A_path) @@ -1968,7 +1968,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - "--depth=immediates", A_path) + True, "--depth=immediates", A_path) # Check that the A directory was pull ed in at depth=immediates. verify_depth(None, "immediates", A_path) @@ -2025,7 +2025,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'empty', A_path) verify_depth(None, "empty", A_path) @@ -2055,7 +2055,8 @@ expected_output, expected_disk, expected_status, - None, None, None, None, None, False, + None, None, None, None, + None, False, True, '--depth=empty', '-r1', iota_path) # Check the revision and created rev. @@ -2092,7 +2093,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'exclude', E_path) # verify_depth exclude? not implemented yet @@ -2111,7 +2112,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', B_path) verify_depth(None, "immediates", B_path) @@ -2130,7 +2131,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'exclude', B_path) # Explicitly pull in excluded path B. @@ -2150,7 +2151,7 @@ expected_status, None, None, None, None, None, None, - B_path) + True, B_path) # Test issue # # Exclude a file then set depth of WC to infinity, the file should return. @@ -2164,7 +2165,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'exclude', iota_path) # Update the whole WC to depth=infinity. @@ -2181,7 +2182,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'infinity', wc_dir) def excluded_path_misc_operation(sbox): @@ -2210,7 +2211,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'exclude', E_path) # copy A/B to A/L, excluded entry should be copied too @@ -2301,7 +2302,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, "--set-depth", "exclude", B_path) # Remove path B in the repos. @@ -2436,7 +2437,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - '-r1', A) + True, '-r1', A) # Perform node deletions so that items become unversioned and # will have tree-conflicts upon update. @@ -2479,7 +2480,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - wc) + True, wc) @@ -2559,7 +2560,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'exclude', B_path) # Update to depth 'empty' for the excluded path A/B @@ -2577,7 +2578,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'empty', B_path) verify_depth(None, "empty", B_path) expected_info = { @@ -2610,7 +2611,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'files', B_path) verify_depth(None, "files", B_path) expected_info = { @@ -2649,7 +2650,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'immediates', B_path) verify_depth(None, "immediates", B_path) expected_info = { @@ -2680,7 +2681,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, + None, None, None, None, False, '--set-depth', 'infinity', B_path) verify_depth(None, "infinity", B_path) expected_info = { @@ -2728,7 +2729,7 @@ expected_disk, expected_status, None, None, - None, None, None, None, wc_dir) + None, None, None, None, True, wc_dir) def sparse_update_with_dash_dash_parents(sbox): """update --parents""" @@ -2770,7 +2771,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - '--parents', alpha_path) + False, '--parents', alpha_path) expected_output = svntest.wc.State(sbox.wc_dir, { 'A/D' : Item(status='A '), @@ -2792,7 +2793,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - '--parents', pi_path) + False, '--parents', pi_path) expected_output = svntest.wc.State(sbox.wc_dir, { 'A/D/H' : Item(status='A '), @@ -2811,7 +2812,7 @@ expected_disk, expected_status, None, None, None, None, None, False, - '--parents', omega_path) + False, '--parents', omega_path) #----------------------------------------------------------------------