Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/workqueue.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/workqueue.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/libsvn_wc/workqueue.c (original) +++ subversion/branches/move-tracking-2/subversion/libsvn_wc/workqueue.c Mon Feb 16 17:40:07 2015 @@ -1107,7 +1107,7 @@ run_prej_install(work_item_baton_t *wqb, SVN_ERR(svn_wc__db_from_relpath(&local_abspath, db, wri_abspath, local_relpath, scratch_pool, scratch_pool)); - SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath, + SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, db, local_abspath, scratch_pool, scratch_pool)); SVN_ERR(svn_wc__conflict_read_prop_conflict(&prejfile_abspath, @@ -1287,7 +1287,7 @@ run_set_text_conflict_markers(work_item_ /* Check if we should combine with a property conflict... */ svn_skel_t *conflicts; - SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath, + SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, db, local_abspath, scratch_pool, scratch_pool)); if (! conflicts) @@ -1353,7 +1353,7 @@ run_set_property_conflict_marker(work_it svn_skel_t *conflicts; apr_hash_t *prop_names; - SVN_ERR(svn_wc__db_read_conflict(&conflicts, db, local_abspath, + SVN_ERR(svn_wc__db_read_conflict(&conflicts, NULL, db, local_abspath, scratch_pool, scratch_pool)); if (! conflicts)
Modified: subversion/branches/move-tracking-2/subversion/mod_dav_svn/lock.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/mod_dav_svn/lock.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/mod_dav_svn/lock.c (original) +++ subversion/branches/move-tracking-2/subversion/mod_dav_svn/lock.c Mon Feb 16 17:40:07 2015 @@ -805,7 +805,7 @@ append_locks(dav_lockdb *lockdb, to return the lock details? Add yet another custom header? - Just an header doesn't handle a full error chain... + Just an header doesn't handle a full error chain... ### Current behavior: we don't report an error. */ Modified: subversion/branches/move-tracking-2/subversion/mod_dav_svn/mod_dav_svn.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/mod_dav_svn/mod_dav_svn.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/mod_dav_svn/mod_dav_svn.c (original) +++ subversion/branches/move-tracking-2/subversion/mod_dav_svn/mod_dav_svn.c Mon Feb 16 17:40:07 2015 @@ -249,7 +249,7 @@ merge_dir_config(apr_pool_t *p, void *ba newconf->txdelta_cache = INHERIT_VALUE(parent, child, txdelta_cache); newconf->fulltext_cache = INHERIT_VALUE(parent, child, fulltext_cache); newconf->revprop_cache = INHERIT_VALUE(parent, child, revprop_cache); - newconf->block_read = INHERIT_VALUE(parent, child, block_read); + newconf->block_read = INHERIT_VALUE(parent, child, block_read); newconf->root_dir = INHERIT_VALUE(parent, child, root_dir); newconf->hooks_env = INHERIT_VALUE(parent, child, hooks_env); Modified: subversion/branches/move-tracking-2/subversion/mod_dav_svn/status.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/mod_dav_svn/status.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/mod_dav_svn/status.c (original) +++ subversion/branches/move-tracking-2/subversion/mod_dav_svn/status.c Mon Feb 16 17:40:07 2015 @@ -57,7 +57,7 @@ int dav_svn__status(request_rec *r) ap_set_content_type(r, "text/html; charset=ISO-8859-1"); - ap_rvputs(r, + ap_rvputs(r, DOCTYPE_HTML_3_2 "<html><head>\n" "<title>Apache SVN Status</title>\n" Modified: subversion/branches/move-tracking-2/subversion/svn/auth-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/auth-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/auth-cmd.c (original) +++ subversion/branches/move-tracking-2/subversion/svn/auth-cmd.c Mon Feb 16 17:40:07 2015 @@ -373,7 +373,7 @@ svn_cl__auth(apr_getopt_t *os, void *bat SVN_ERR(svn_cmdline_printf(pool, _("Credentials cache in '%s' is empty\n"), svn_dirent_local_style(config_path, pool))); - else + else return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, 0, _("Credentials cache in '%s' contains " "no matching credentials"), Modified: subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.c (original) +++ subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.c Mon Feb 16 17:40:07 2015 @@ -337,6 +337,27 @@ svn_cl__get_human_readable_tree_conflict return SVN_NO_ERROR; } +svn_error_t * +svn_cl__get_human_readable_action_description( + const char **desc, + svn_wc_conflict_action_t action, + svn_wc_operation_t operation, + svn_node_kind_t kind, + apr_pool_t *pool) +{ + const char *action_s, *operation_s; + + action_s = incoming_action_str(kind, action); + operation_s = operation_str(operation); + + SVN_ERR_ASSERT(operation_s); + + *desc = apr_psprintf(pool, _("%s %s"), + action_s, operation_s); + + return SVN_NO_ERROR; +} + /* Helper for svn_cl__append_tree_conflict_info_xml(). * Appends the attributes of the given VERSION to ATT_HASH. Modified: subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.h URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.h?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.h (original) +++ subversion/branches/move-tracking-2/subversion/svn/cl-conflicts.h Mon Feb 16 17:40:07 2015 @@ -63,6 +63,16 @@ svn_cl__get_human_readable_tree_conflict const svn_wc_conflict_description2_t *conflict, apr_pool_t *pool); +/* Like svn_cl__get_human_readable_tree_conflict_description but + for other conflict types */ +svn_error_t * +svn_cl__get_human_readable_action_description( + const char **desc, + svn_wc_conflict_action_t action, + svn_wc_operation_t operation, + svn_node_kind_t kind, + apr_pool_t *pool); + /** * Append to @a str an XML representation of the conflict data * for @a conflict, in a format suitable for 'svn info --xml'. Modified: subversion/branches/move-tracking-2/subversion/svn/cl.h URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/cl.h?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/cl.h (original) +++ subversion/branches/move-tracking-2/subversion/svn/cl.h Mon Feb 16 17:40:07 2015 @@ -248,6 +248,7 @@ typedef struct svn_cl__opt_state_t svn_boolean_t remove_ignored; /* remove ignored items */ svn_boolean_t no_newline; /* do not output the trailing newline */ svn_boolean_t show_passwords; /* show cached passwords */ + svn_boolean_t pin_externals; /* pin externals to last-changed revisions */ } svn_cl__opt_state_t; Modified: subversion/branches/move-tracking-2/subversion/svn/copy-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/copy-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/copy-cmd.c (original) +++ subversion/branches/move-tracking-2/subversion/svn/copy-cmd.c Mon Feb 16 17:40:07 2015 @@ -167,8 +167,10 @@ svn_cl__copy(apr_getopt_t *os, SVN_ERR(svn_cl__make_log_msg_baton(&(ctx->log_msg_baton3), opt_state, NULL, ctx->config, pool)); - err = svn_client_copy6(sources, dst_path, TRUE, + err = svn_client_copy7(sources, dst_path, TRUE, opt_state->parents, opt_state->ignore_externals, + opt_state->pin_externals, + NULL, /* pin all externals */ opt_state->revprop_table, (opt_state->quiet ? NULL : svn_cl__print_commit_info), NULL, Modified: subversion/branches/move-tracking-2/subversion/svn/info-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/info-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/info-cmd.c (original) +++ subversion/branches/move-tracking-2/subversion/svn/info-cmd.c Mon Feb 16 17:40:07 2015 @@ -389,30 +389,18 @@ print_info(void *baton, SVN_ERR(svn_cmdline_printf(pool, _("Copied From Rev: %ld\n"), info->wc_info->copyfrom_rev)); if (info->wc_info->moved_from_abspath) - { - const char *relpath; - - relpath = svn_dirent_skip_ancestor(info->wc_info->wcroot_abspath, - info->wc_info->moved_from_abspath); - if (relpath && relpath[0] != '\0') - SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"), relpath)); - else - SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"), - info->wc_info->moved_from_abspath)); - } + SVN_ERR(svn_cmdline_printf(pool, _("Moved From: %s\n"), + svn_cl__local_style_skip_ancestor( + path_prefix, + info->wc_info->moved_from_abspath, + pool))); if (info->wc_info->moved_to_abspath) - { - const char *relpath; - - relpath = svn_dirent_skip_ancestor(info->wc_info->wcroot_abspath, - info->wc_info->moved_to_abspath); - if (relpath && relpath[0] != '\0') - SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"), relpath)); - else - SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"), - info->wc_info->moved_to_abspath)); - } + SVN_ERR(svn_cmdline_printf(pool, _("Moved To: %s\n"), + svn_cl__local_style_skip_ancestor( + path_prefix, + info->wc_info->moved_to_abspath, + pool))); } if (info->last_changed_author) @@ -441,6 +429,7 @@ print_info(void *baton, if (info->wc_info->conflicts) { svn_boolean_t printed_prop_conflict_file = FALSE; + svn_boolean_t printed_tc = FALSE; int i; for (i = 0; i < info->wc_info->conflicts->nelts; i++) @@ -479,12 +468,15 @@ print_info(void *baton, if (! printed_prop_conflict_file) SVN_ERR(svn_cmdline_printf(pool, _("Conflict Properties File: %s\n"), - svn_dirent_local_style(conflict->their_abspath, - pool))); + svn_cl__local_style_skip_ancestor( + path_prefix, + conflict->prop_reject_abspath, + pool))); printed_prop_conflict_file = TRUE; break; case svn_wc_conflict_kind_tree: + printed_tc = TRUE; SVN_ERR( svn_cl__get_human_readable_tree_conflict_description( &desc, conflict, pool)); @@ -506,6 +498,19 @@ print_info(void *baton, APR_ARRAY_IDX(info->wc_info->conflicts, 0, const svn_wc_conflict_description2_t *); + if (!printed_tc) + { + const char *desc; + + SVN_ERR(svn_cl__get_human_readable_action_description(&desc, + svn_wc_conflict_action_edit, + conflict->operation, + conflict->node_kind, pool)); + + SVN_ERR(svn_cmdline_printf(pool, "%s: %s\n", + _("Conflict Details"), desc)); + } + src_left_version = svn_cl__node_description(conflict->src_left_version, info->repos_root_URL, pool); Modified: subversion/branches/move-tracking-2/subversion/svn/mergeinfo-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/mergeinfo-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/mergeinfo-cmd.c (original) +++ subversion/branches/move-tracking-2/subversion/svn/mergeinfo-cmd.c Mon Feb 16 17:40:07 2015 @@ -240,7 +240,7 @@ mergeinfo_summary( target_is_wc = (! svn_path_is_url(target_path_or_url)) && (target_revision->kind == svn_opt_revision_unspecified - || target_revision->kind == svn_opt_revision_working + || target_revision->kind == svn_opt_revision_working || target_revision->kind == svn_opt_revision_base); SVN_ERR(svn_client_get_merging_summary( &is_reintegration, @@ -304,10 +304,10 @@ mergeinfo_log(svn_boolean_t finding_merg baton->show_diff = FALSE; baton->depth = depth; baton->diff_extensions = NULL; - baton->merge_stack = NULL; + baton->merge_stack = NULL; baton->search_patterns = NULL; baton->pool = pool; - log_receiver_baton = baton; + log_receiver_baton = baton; } else { Modified: subversion/branches/move-tracking-2/subversion/svn/notify.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/notify.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/notify.c (original) +++ subversion/branches/move-tracking-2/subversion/svn/notify.c Mon Feb 16 17:40:07 2015 @@ -129,7 +129,7 @@ svn_cl__conflict_stats_resolved(svn_cl__ static const char * remaining_str(apr_pool_t *pool, int n_remaining) { - return apr_psprintf(pool, Q_("%d remaining", + return apr_psprintf(pool, Q_("%d remaining", "%d remaining", n_remaining), n_remaining); Modified: subversion/branches/move-tracking-2/subversion/svn/propget-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/propget-cmd.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/propget-cmd.c (original) +++ subversion/branches/move-tracking-2/subversion/svn/propget-cmd.c Mon Feb 16 17:40:07 2015 @@ -490,7 +490,7 @@ svn_cl__propget(apr_getopt_t *os, { svn_error_t *err; err = svn_error_createf(SVN_ERR_PROPERTY_NOT_FOUND, NULL, - _("Property '%s' not found on '%s'"), + _("Property '%s' not found on '%s'"), pname_utf8, target); svn_handle_warning2(stderr, err, "svn: "); svn_error_clear(err); Modified: subversion/branches/move-tracking-2/subversion/svn/svn.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/svn.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/svn.c (original) +++ subversion/branches/move-tracking-2/subversion/svn/svn.c Mon Feb 16 17:40:07 2015 @@ -144,7 +144,8 @@ typedef enum svn_cl__longopt_t { opt_remove_unversioned, opt_remove_ignored, opt_no_newline, - opt_show_passwords + opt_show_passwords, + opt_pin_externals, } svn_cl__longopt_t; @@ -418,6 +419,10 @@ const apr_getopt_option_t svn_cl__option {"remove-ignored", opt_remove_ignored, 0, N_("remove ignored items")}, {"no-newline", opt_no_newline, 0, N_("do not output the trailing newline")}, {"show-passwords", opt_show_passwords, 0, N_("show cached passwords")}, + {"pin-externals", opt_pin_externals, 0, + N_("pin externals with no explicit revision to their\n" + " " + "current revision (recommended when tagging)")}, /* Long-opt Aliases * @@ -498,7 +503,7 @@ const svn_opt_subcommand_desc2_t svn_cl_ " expand them.\n"), { opt_remove, opt_show_passwords }, { {opt_remove, N_("remove matching authentication credentials")} } - + }, { "blame", svn_cl__blame, {"praise", "annotate", "ann"}, N_ @@ -608,7 +613,8 @@ const svn_opt_subcommand_desc2_t svn_cl_ " contact the repository. As such, they may not, by default, be able\n" " to propagate merge tracking information from the source of the copy\n" " to the destination.\n"), - {'r', 'q', opt_ignore_externals, opt_parents, SVN_CL__LOG_MSG_OPTIONS} }, + {'r', 'q', opt_ignore_externals, opt_parents, SVN_CL__LOG_MSG_OPTIONS, + opt_pin_externals} }, { "delete", svn_cl__delete, {"del", "remove", "rm"}, N_ ("Remove files and directories from version control.\n" @@ -2390,6 +2396,9 @@ sub_main(int *exit_code, int argc, const case opt_show_passwords: opt_state.show_passwords = TRUE; break; + case opt_pin_externals: + opt_state.pin_externals = TRUE; + break; default: /* Hmmm. Perhaps this would be a good place to squirrel away opts that commands like svn diff might need. Hmmm indeed. */ Modified: subversion/branches/move-tracking-2/subversion/svn/util.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/util.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svn/util.c (original) +++ subversion/branches/move-tracking-2/subversion/svn/util.c Mon Feb 16 17:40:07 2015 @@ -75,6 +75,13 @@ svn_cl__print_commit_info(const svn_comm void *baton, apr_pool_t *pool) { + /* Be very careful with returning errors from this callback as those + will be returned as errors from editor->close_edit(...), which may + cause callers to assume that the commit itself failed. + + See log message of r1659867 and the svn_ra_get_commit_editor3 + documentation for details on error scenarios. */ + if (SVN_IS_VALID_REVNUM(commit_info->revision)) SVN_ERR(svn_cmdline_printf(pool, _("Committed revision %ld%s.\n"), commit_info->revision, Modified: subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c (original) +++ subversion/branches/move-tracking-2/subversion/svnadmin/svnadmin.c Mon Feb 16 17:40:07 2015 @@ -906,7 +906,7 @@ repos_notify_handler(void *baton, if (b->error_summary && notify->revision != SVN_INVALID_REVNUM) { struct verification_error *verr; - + verr = apr_palloc(b->result_pool, sizeof(*verr)); verr->rev = notify->revision; verr->err = svn_error_dup(notify->err); @@ -1880,7 +1880,7 @@ subcommand_verify(apr_getopt_t *os, void struct verification_error *verr; svn_error_t *err; const char *rev_str; - + svn_pool_clear(iterpool); verr = APR_ARRAY_IDX(notify_baton.error_summary, i, @@ -1892,7 +1892,7 @@ subcommand_verify(apr_getopt_t *os, void { char buf[512]; const char *message; - + message = svn_err_best_message(err, buf, sizeof(buf)); svn_error_clear(svn_stream_printf(notify_baton.feedback_stream, iterpool, Modified: subversion/branches/move-tracking-2/subversion/svndumpfilter/svndumpfilter.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svndumpfilter/svndumpfilter.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svndumpfilter/svndumpfilter.c (original) +++ subversion/branches/move-tracking-2/subversion/svndumpfilter/svndumpfilter.c Mon Feb 16 17:40:07 2015 @@ -278,7 +278,7 @@ struct node_baton_t svn_filesize_t tcl; /* Pointers to dumpfile data. */ - apr_array_header_t *headers; + svn_repos__dumpfile_headers_t *headers; svn_stringbuf_t *props; /* Expect deltas? */ Modified: subversion/branches/move-tracking-2/subversion/svnrdump/dump_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnrdump/dump_editor.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svnrdump/dump_editor.c (original) +++ subversion/branches/move-tracking-2/subversion/svnrdump/dump_editor.c Mon Feb 16 17:40:07 2015 @@ -58,7 +58,7 @@ struct dir_baton svn_revnum_t copyfrom_rev; /* Headers accumulated so far for this directory */ - apr_array_header_t *headers; + svn_repos__dumpfile_headers_t *headers; /* Properties which were modified during change_dir_prop. */ apr_hash_t *props; @@ -72,9 +72,8 @@ struct dir_baton us, although they're all really within this directory. */ apr_hash_t *deleted_entries; - /* Flags to trigger dumping props and record termination newlines. */ + /* Flag to trigger dumping props. */ svn_boolean_t dump_props; - svn_boolean_t dump_newlines; }; /* A file baton used by all file-related callback functions in the dump @@ -223,7 +222,7 @@ make_file_baton(const char *path, * content section, to represent the property delta of PROPS/DELETED_PROPS. */ static svn_error_t * -get_props_content(apr_array_header_t *headers, +get_props_content(svn_repos__dumpfile_headers_t *headers, svn_stringbuf_t **content, apr_hash_t *props, apr_hash_t *deleted_props, @@ -262,7 +261,8 @@ dump_node_delete(svn_stream_t *stream, const char *node_relpath, apr_pool_t *pool) { - apr_array_header_t *headers = svn_repos__dumpfile_headers_create(pool); + svn_repos__dumpfile_headers_t *headers + = svn_repos__dumpfile_headers_create(pool); assert(svn_relpath_is_canonical(node_relpath)); @@ -274,7 +274,9 @@ dump_node_delete(svn_stream_t *stream, svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_ACTION, "delete"); - SVN_ERR(svn_repos__dump_headers(stream, headers, TRUE, pool)); + SVN_ERR(svn_repos__dump_node_record(stream, headers, + NULL, FALSE, 0, /* props & text */ + FALSE /*content_length_always*/, pool)); return SVN_NO_ERROR; } @@ -296,7 +298,7 @@ dump_node_delete(svn_stream_t *stream, * header block.) */ static svn_error_t * -dump_node(apr_array_header_t **headers_p, +dump_node(svn_repos__dumpfile_headers_t **headers_p, struct dump_edit_baton *eb, const char *repos_relpath, struct dir_baton *db, @@ -308,7 +310,8 @@ dump_node(apr_array_header_t **headers_p apr_pool_t *pool) { const char *node_relpath = repos_relpath; - apr_array_header_t *headers = svn_repos__dumpfile_headers_create(pool); + svn_repos__dumpfile_headers_t *headers + = svn_repos__dumpfile_headers_create(pool); assert(svn_relpath_is_canonical(repos_relpath)); assert(!copyfrom_path || svn_relpath_is_canonical(copyfrom_path)); @@ -394,16 +397,6 @@ dump_node(apr_array_header_t **headers_p headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV, "%ld", copyfrom_rev); svn_repos__dumpfile_header_push( headers, SVN_REPOS_DUMPFILE_NODE_COPYFROM_PATH, copyfrom_path); - - /* Ugly hack: If a directory was copied from a previous - revision, nothing like close_file() will be called to write two - blank lines. If change_dir_prop() is called, props are dumped - (along with the necessary PROPS-END\n\n and we're good. So - set DUMP_NEWLINES here to print the newlines unless - change_dir_prop() is called next otherwise the `svnadmin load` - parser will fail. */ - if (db) - db->dump_newlines = TRUE; } else { @@ -445,7 +438,8 @@ dump_mkdir(struct dump_edit_baton *eb, apr_pool_t *pool) { svn_stringbuf_t *prop_content; - apr_array_header_t *headers = svn_repos__dumpfile_headers_create(pool); + svn_repos__dumpfile_headers_t *headers + = svn_repos__dumpfile_headers_create(pool); /* Node-path: ... */ svn_repos__dumpfile_header_push( @@ -496,25 +490,18 @@ dump_pending_dir(struct dump_edit_baton FALSE, 0, FALSE /*content_length_always*/, scratch_pool)); + /* No text is going to be dumped. Write a couple of newlines and + wait for the next node/ revision. */ + SVN_ERR(svn_stream_puts(eb->stream, "\n\n")); + if (db->dump_props) { - /* No text is going to be dumped. Write a couple of newlines and - wait for the next node/ revision. */ - SVN_ERR(svn_stream_puts(eb->stream, "\n\n")); - /* Cleanup so that data is never dumped twice. */ apr_hash_clear(db->props); apr_hash_clear(db->deleted_props); db->dump_props = FALSE; } - /* Some pending newlines to dump? */ - if (db->dump_newlines) - { - SVN_ERR(svn_stream_puts(eb->stream, "\n\n")); - db->dump_newlines = FALSE; - } - /* Anything that was pending is pending no longer. */ eb->pending_db = NULL; @@ -828,9 +815,7 @@ change_dir_prop(void *parent_baton, else svn_hash_sets(db->deleted_props, apr_pstrdup(db->pool, name), ""); - /* Make sure we eventually output the props, and disable printing - a couple of extra newlines */ - db->dump_newlines = FALSE; + /* Make sure we eventually output the props */ db->dump_props = TRUE; return SVN_NO_ERROR; @@ -896,7 +881,7 @@ close_file(void *file_baton, struct dump_edit_baton *eb = fb->eb; apr_finfo_t *info = apr_pcalloc(pool, sizeof(apr_finfo_t)); svn_stringbuf_t *propstring = NULL; - apr_array_header_t *headers; + svn_repos__dumpfile_headers_t *headers; SVN_ERR(dump_pending_dir(eb, pool)); Modified: subversion/branches/move-tracking-2/subversion/svnserve/logger.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnserve/logger.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svnserve/logger.c (original) +++ subversion/branches/move-tracking-2/subversion/svnserve/logger.c Mon Feb 16 17:40:07 2015 @@ -58,7 +58,7 @@ logger__create_for_stderr(logger_t **log { logger_t *result = apr_pcalloc(pool, sizeof(*result)); result->pool = svn_pool_create(pool); - + SVN_ERR(svn_stream_for_stderr(&result->stream, pool)); SVN_ERR(svn_mutex__init(&result->mutex, TRUE, pool)); @@ -74,7 +74,7 @@ logger__create(logger_t **logger, { logger_t *result = apr_pcalloc(pool, sizeof(*result)); apr_file_t *file; - + SVN_ERR(svn_io_file_open(&file, filename, APR_WRITE | APR_CREATE | APR_APPEND, APR_OS_DEFAULT, pool)); @@ -145,7 +145,7 @@ logger__log_error(logger_t *logger, } svn_pool_clear(logger->pool); - + svn_error_clear(svn_mutex__unlock(logger->mutex, SVN_NO_ERROR)); } } Modified: subversion/branches/move-tracking-2/subversion/svnserve/serve.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnserve/serve.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svnserve/serve.c (original) +++ subversion/branches/move-tracking-2/subversion/svnserve/serve.c Mon Feb 16 17:40:07 2015 @@ -2179,7 +2179,7 @@ static svn_error_t *log_receiver(void *b } } SVN_ERR(svn_ra_svn__end_list(conn, pool)); - + /* send LOG_ENTRY main members */ SVN_ERR(svn_ra_svn__write_data_log_entry(conn, pool, log_entry->revision, @@ -2856,7 +2856,7 @@ static svn_error_t *lock_many(svn_ra_svn ¤t_rev); if (write_err) break; - + full_path = svn_fspath__join(b->repository->fs_path->data, svn_relpath_canonicalize(path, subpool), subpool); @@ -3755,7 +3755,7 @@ construct_server_baton(server_baton_t ** server_baton_t *b = apr_pcalloc(conn_pool, sizeof(*b)); fs_warning_baton_t *warn_baton; svn_stringbuf_t *cap_log = svn_stringbuf_create_empty(scratch_pool); - + b->repository = apr_pcalloc(conn_pool, sizeof(*b->repository)); b->repository->username_case = params->username_case; b->repository->base = params->base; @@ -3857,7 +3857,7 @@ construct_server_baton(server_baton_t ** err = handle_config_error(find_repos(client_url, params->root, b->vhost, b->read_only, params->cfg, b->repository, params->config_pool, - params->authz_pool, params->fs_config, + params->authz_pool, params->fs_config, conn_pool, scratch_pool), b); if (!err) Modified: subversion/branches/move-tracking-2/subversion/svnserve/server.h URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnserve/server.h?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svnserve/server.h (original) +++ subversion/branches/move-tracking-2/subversion/svnserve/server.h Mon Feb 16 17:40:07 2015 @@ -40,7 +40,7 @@ extern "C" { #include "private/svn_mutex.h" #include "private/svn_repos_private.h" #include "private/svn_subr_private.h" - + enum username_case_type { CASE_FORCE_UPPER, CASE_FORCE_LOWER, CASE_ASIS }; enum authn_type { UNAUTHENTICATED, AUTHENTICATED }; @@ -70,7 +70,7 @@ typedef struct repository_t { enum access_type auth_access; /* access granted to authenticated users */ enum access_type anon_access; /* access granted to annonymous users */ - + } repository_t; typedef struct client_info_t { @@ -186,7 +186,7 @@ typedef struct connection_t the new thread decrease it and when it reaches 0 the pool can be released. */ svn_atomic_t ref_count; - + } connection_t; /* Return a client_info_t structure allocated in POOL and initialize it Modified: subversion/branches/move-tracking-2/subversion/svnserve/svnserve.c URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnserve/svnserve.c?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/svnserve/svnserve.c (original) +++ subversion/branches/move-tracking-2/subversion/svnserve/svnserve.c Mon Feb 16 17:40:07 2015 @@ -126,7 +126,7 @@ enum run_mode { * * Since very slow connections will hog a full thread for a potentially * long time before timing out, be sure to not set this limit too low. - * + * * On the other hand, keep in mind that every thread will allocate up to * 4MB of unused RAM in the APR allocator of its root pool. 32 bit servers * must hence do with fewer threads. @@ -150,7 +150,7 @@ enum run_mode { * * Larger values improve scalability with lots of small requests coming * on over long latency networks. - * + * * The OS may actually use a lower limit than specified here. */ #define ACCEPT_BACKLOG 128 @@ -475,7 +475,7 @@ static apr_status_t redirect_stdout(void /* Wait for the next client connection to come in from SOCK. Allocate * the connection in a root pool from CONNECTION_POOLS and assign PARAMS. * Return the connection object in *CONNECTION. - * + * * Use HANDLING_MODE for proper internal cleanup. */ static svn_error_t * @@ -486,30 +486,30 @@ accept_connection(connection_t **connect apr_pool_t *pool) { apr_status_t status; - + /* Non-standard pool handling. The main thread never blocks to join * the connection threads so it cannot clean up after each one. So * separate pools that can be cleared at thread exit are used. */ - + apr_pool_t *connection_pool = svn_pool_create(pool); *connection = apr_pcalloc(connection_pool, sizeof(**connection)); (*connection)->pool = connection_pool; (*connection)->params = params; (*connection)->ref_count = 1; - + do { #ifdef WIN32 if (winservice_is_stopping()) exit(0); #endif - + status = apr_socket_accept(&(*connection)->usock, sock, connection_pool); if (handling_mode == connection_mode_fork) { apr_proc_t proc; - + /* Collect any zombie child processes. */ while (apr_proc_wait_all_procs(&proc, NULL, NULL, APR_NOWAIT, connection_pool) == APR_CHILD_DONE) @@ -519,7 +519,7 @@ accept_connection(connection_t **connect while (APR_STATUS_IS_EINTR(status) || APR_STATUS_IS_ECONNABORTED(status) || APR_STATUS_IS_ECONNRESET(status)); - + return status ? svn_error_wrap_apr(status, _("Can't accept client connection")) : SVN_NO_ERROR; @@ -611,7 +611,7 @@ static void * APR_THREAD_FUNC serve_thre close_connection(connection); else apr_thread_pool_push(threads, serve_thread, connection, 0, NULL); - + return NULL; } @@ -983,7 +983,7 @@ sub_main(int *exit_code, int argc, const svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS, cache_revprops ? "2" :"0"); svn_hash_sets(params.fs_config, SVN_FS_CONFIG_FSFS_BLOCK_READ, - use_block_read ? "1" :"0"); + use_block_read ? "1" :"0"); SVN_ERR(svn_repos__config_pool_create(¶ms.config_pool, is_multi_threaded, @@ -1001,7 +1001,7 @@ sub_main(int *exit_code, int argc, const SVN_ERR(svn_repos__config_pool_get(¶ms.cfg, NULL, params.config_pool, - config_filename, + config_filename, TRUE, /* must_exist */ FALSE, /* names_case_sensitive */ NULL, Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/blame_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/blame_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/blame_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/blame_tests.py Mon Feb 16 17:40:07 2015 @@ -951,12 +951,12 @@ def blame_youngest_to_oldest(sbox): line = "New contents for iota\n" svntest.main.file_append(iota, line) sbox.simple_commit() - + # Move the file, to check that the operation will peg correctly. iota_moved = sbox.ospath('iota_moved') sbox.simple_move('iota', 'iota_moved') sbox.simple_commit() - + # Delete a line. open(iota_moved, 'w').write(line) sbox.simple_commit() Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/checkout_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/checkout_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/checkout_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/checkout_tests.py Mon Feb 16 17:40:07 2015 @@ -707,7 +707,7 @@ def checkout_peg_rev_date(sbox): expected_output, expected_wc) - # now try another checkout with repo@r1_string + # now try another checkout with repo@r1_string checkout_target = sbox.add_wc_path('checkout2') os.mkdir(checkout_target) @@ -1160,9 +1160,9 @@ def checkout_wc_from_drive(sbox): 'D/G/tau' : Item(contents="This is the file 'tau'.\n"), 'D/G/pi' : Item(contents="This is the file 'pi'.\n"), 'D/gamma' : Item(contents="This is the file 'gamma'.\n"), - 'mu' : Item(contents="This is the file 'mu'.\n"), + 'mu' : Item(contents="This is the file 'mu'.\n"), }) - + svntest.actions.run_and_verify_checkout(repo_url + '/A', wc2_dir, expected_output, expected_wc, None, None, None, None) @@ -1187,7 +1187,7 @@ def checkout_wc_from_drive(sbox): 'G/pi' : Item(contents="This is the file 'pi'.\n"), 'G/tau' : Item(contents="This is the file 'tau'.\n"), 'G/rho' : Item(contents="This is the file 'rho'.\n"), - 'gamma' : Item(contents="This is the file 'gamma'.\n"), + 'gamma' : Item(contents="This is the file 'gamma'.\n"), }) svntest.actions.run_and_verify_checkout(repo_url + '/A/D', wc3_dir, Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/commit_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/commit_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/commit_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/commit_tests.py Mon Feb 16 17:40:07 2015 @@ -2931,17 +2931,17 @@ def last_changed_of_copied_subdir(sbox): def commit_unversioned(sbox): "verify behavior on unversioned targets" - + sbox.build(read_only=True) wc_dir = sbox.wc_dir - + expected_err = 'E200009: .*existing.*\' is not under version control' # Unversioned, but existing file - svntest.main.file_write(sbox.ospath('existing'), "xxxx") + svntest.main.file_write(sbox.ospath('existing'), "xxxx") svntest.actions.run_and_verify_commit(wc_dir, None, None, expected_err, sbox.ospath('existing')) - + # Unversioned, not existing svntest.actions.run_and_verify_commit(wc_dir, None, None, expected_err, sbox.ospath('not-existing')) Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/dav-mirror-autocheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/dav-mirror-autocheck.sh?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/dav-mirror-autocheck.sh (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/dav-mirror-autocheck.sh Mon Feb 16 17:40:07 2015 @@ -23,7 +23,7 @@ # to the slave. The test should be able to throw all kinds # of svn operations at one or the other, and master/slave # verified as identical in the end. -# +# # Master / slave setup is achieved in a single httpd process # using virtual hosts bound to different addresses on the # loopback network (127.0.0.1, 127.0.0.2) for slave and @@ -34,7 +34,7 @@ # http://subversion.tigris.org/issues/show_bug.cgi?id=2939 # But of course, any svn traffic liable to break over # mirroring would be a good addition. -# +# # Most of the httpd setup was lifted from davautocheck.sh. # The common boilerplate snippets to setup/start/stop httpd # between the two could be factored out and shared. @@ -95,7 +95,7 @@ function get_prog_name() { return 1 } -# splat out httpd config +# splat out httpd config function setup_config() { say "setting up config: " $1 @@ -152,7 +152,7 @@ CustomLog "${HTTPD_ROOT}/ops" ServerName ${SLAVE_HOST} CustomLog "${HTTPD_ROOT}/slave_access_log" common ErrorLog "${HTTPD_ROOT}/slave_error_log" -# slave 'normal' location +# slave 'normal' location <Location "/${SLAVE_LOCATION}"> DAV svn SVNPath "${SLAVE_REPOS}" @@ -196,7 +196,7 @@ function usage() { echo echo " " '<test-work-directory>' must not exist, \ I will not clobber it for you 1>&2 - exit 1 + exit 1 } ### Start execution here ### @@ -403,7 +403,7 @@ $SVNSYNC initialize --non-interactive "$ # # reproducible test case from: # http://subversion.tigris.org/issues/show_bug.cgi?id=2939 -# +# BASE_URL="$SLAVE_URL" say running svnmucc test to $BASE_URL svnmucc="$SVNMUCC --non-interactive --username jrandom --password rayjandom -mm" @@ -492,7 +492,7 @@ say "Some house-keeping..." say "Re-activating the post-commit hook on the master repo: $MASTER_REPOS." mv "$MASTER_REPOS/hooks/post-commit_" "$MASTER_REPOS/hooks/post-commit" say "Syncing slave with master." -$SVNSYNC --non-interactive sync "$SYNC_URL" --username=svnsync --password=svnsync +$SVNSYNC --non-interactive sync "$SYNC_URL" --username=svnsync --password=svnsync # shut it down echo -n "${SCRIPT}: stopping httpd: " $HTTPD -f $HTTPD_CONFIG -k stop Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/davautocheck.sh Mon Feb 16 17:40:07 2015 @@ -62,7 +62,7 @@ # one version's client against another version's server) specify both APXS # *and* MODULE_PATH for the other server: # -# APXS=/opt/svn/1.4.x/bin/apxs MODULE_PATH=/opt/svn/1.4.x/modules \ +# APXS=/opt/svn/1.4.x/bin/apxs MODULE_PATH=/opt/svn/1.4.x/modules \ # subversion/tests/cmdline/davautocheck.sh # # To prevent the server from advertising httpv2, pass USE_HTTPV1 in @@ -71,7 +71,7 @@ # To enable "SVNCacheRevProps on" set CACHE_REVPROPS in the environment. # # To test over https set USE_SSL in the environment. -# +# # To use value for "SVNPathAuthz" directive set SVN_PATH_AUTHZ with # appropriate value in the environment. # @@ -114,7 +114,7 @@ query() { if [ -n "$BASH_VERSION" ]; then read -n 1 -t 32 else - # + # prog=" import select as s import sys @@ -163,7 +163,7 @@ get_prog_name() { } # Don't assume sbin is in the PATH. -# ### Presumably this is used to locate /usr/sbin/apxs or /usr/sbin/apache2 +# ### Presumably this is used to locate /usr/sbin/apxs or /usr/sbin/apache2 PATH="$PATH:/usr/sbin:/usr/local/sbin" # Find the source and build directories. The build dir can be found if it is Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/export_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/export_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/export_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/export_tests.py Mon Feb 16 17:40:07 2015 @@ -1016,18 +1016,18 @@ def export_file_external(sbox): @Issue(4427) def export_file_externals2(sbox): "exporting file externals" - + sbox.build() sbox.simple_mkdir('DIR', 'DIR2') - + sbox.simple_propset('svn:externals', '^/iota file', 'DIR') sbox.simple_propset('svn:externals', '^/DIR TheDir', 'DIR2') sbox.simple_commit() sbox.simple_update() - + tmp = sbox.add_wc_path('tmp') os.mkdir(tmp) - + expected_output = svntest.wc.State(tmp, { 'file' : Item(status='A '), }) @@ -1040,7 +1040,7 @@ def export_file_externals2(sbox): tmp, expected_output, expected_disk) - + expected_output = svntest.wc.State(tmp, { 'DIR/file' : Item(status='A '), }) @@ -1052,7 +1052,7 @@ def export_file_externals2(sbox): os.path.join(tmp, 'DIR'), expected_output, expected_disk) - + expected_output = svntest.wc.State(tmp, { 'DIR2/TheDir/file' : Item(status='A '), }) Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/externals_tests.py Mon Feb 16 17:40:07 2015 @@ -3343,7 +3343,6 @@ def file_external_versioned_obstruction( expected_status) @Issue(4495) -@XFail() def update_external_peg_rev(sbox): "update external peg rev" @@ -3437,7 +3436,7 @@ def update_deletes_file_external(sbox): # As of r1448345, this update fails: # E000002: Can't remove directory '.../A_copy/C': No such file or directory sbox.simple_update() - + @Issue(4519) def switch_relative_externals(sbox): @@ -3541,6 +3540,540 @@ def replace_tree_with_foreign_external(s None, None, None, None, None, 1, '-r', '2', wc_dir) + +def verify_pinned_externals(sbox, external_url_for, base_path_or_url, + external_youngest_rev, other_external_youngest_rev): + "helper for pin-externals tests" + + expected_output = [ + '%s@%d gamma\n' % (external_url_for["A/B/gamma"], + external_youngest_rev), + '\n', + ] + if svntest.sandbox.is_url(base_path_or_url): + target = base_path_or_url + '/A_copy/B' + else: + target = sbox.ospath('A_copy/B') + svntest.actions.run_and_verify_svn(expected_output, [], + 'propget', 'svn:externals', + target) + expected_output = [ + 'exdir_G -r%d %s\n' % (other_external_youngest_rev, + external_url_for["A/C/exdir_G"]), + '%s exdir_H\n' % external_url_for["A/C/exdir_H"], + '\n', + ] + if svntest.sandbox.is_url(base_path_or_url): + target = base_path_or_url + '/A_copy/C' + else: + target = sbox.ospath('A_copy/C') + svntest.actions.run_and_verify_svn(expected_output, [], + 'propget', 'svn:externals', + target) + expected_output = [ + '%s@%d exdir_A\n' % (external_url_for["A/D/exdir_A"], + other_external_youngest_rev), + '%s@%d exdir_A/G\n' % (external_url_for["A/D/exdir_A/G/"], + other_external_youngest_rev), + 'exdir_A/H -r1 %s\n' % external_url_for["A/D/exdir_A/H"], + '%s@%d x/y/z/blah\n' % (external_url_for["A/D/x/y/z/blah"], + other_external_youngest_rev), + '\n', + ] + if svntest.sandbox.is_url(base_path_or_url): + target = base_path_or_url + '/A_copy/D' + else: + target = sbox.ospath('A_copy/D') + svntest.actions.run_and_verify_svn(expected_output, [], + 'propget', 'svn:externals', + target) + + +def copy_pin_externals_repos_repos(sbox): + "svn copy --pin-externals repos->repos" + + external_url_for = externals_test_setup(sbox) + + repo_url = sbox.repo_url + repo_dir = sbox.repo_dir + other_repo_dir = repo_dir + ".other" + + external_youngest_rev = svntest.main.youngest(repo_dir) + other_external_youngest_rev = svntest.main.youngest(other_repo_dir) + + # Perform a repos->repos copy, pinning externals + svntest.actions.run_and_verify_svn(None, [], + 'copy', + repo_url + '/A', + repo_url + '/A_copy', + '-m', 'copy', + '--pin-externals') + verify_pinned_externals(sbox, external_url_for, repo_url, + external_youngest_rev, other_external_youngest_rev) + + +def copy_pin_externals_repos_wc(sbox): + "svn copy --pin-externals repos->wc" + + external_url_for = externals_test_setup(sbox) + + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + repo_dir = sbox.repo_dir + other_repo_dir = repo_dir + ".other" + + external_youngest_rev = svntest.main.youngest(repo_dir) + other_external_youngest_rev = svntest.main.youngest(other_repo_dir) + + # Create a working copy. + svntest.actions.run_and_verify_svn(None, [], + 'checkout', + repo_url, wc_dir) + + # Perform a repos->wc copy, pinning externals + external_youngest_rev = svntest.main.youngest(repo_dir) + svntest.actions.run_and_verify_svn(None, [], + 'copy', + repo_url + '/A', + os.path.join(wc_dir, 'A_copy'), + '--pin-externals') + verify_pinned_externals(sbox, external_url_for, wc_dir, + external_youngest_rev, other_external_youngest_rev) + + +def copy_pin_externals_wc_repos(sbox): + "svn copy --pin-externals wc->repos" + + external_url_for = externals_test_setup(sbox) + + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + repo_dir = sbox.repo_dir + other_repo_dir = repo_dir + ".other" + + external_youngest_rev = svntest.main.youngest(repo_dir) + other_external_youngest_rev = svntest.main.youngest(other_repo_dir) + + # Create a working copy. + svntest.actions.run_and_verify_svn(None, [], + 'checkout', + repo_url, wc_dir) + + # Perform a wc->repos copy, pinning externals + svntest.actions.run_and_verify_svn(None, [], + 'copy', + os.path.join(wc_dir, 'A'), + repo_url + '/A_copy', + '-m', 'copy', + '--pin-externals') + verify_pinned_externals(sbox, external_url_for, repo_url, + external_youngest_rev, other_external_youngest_rev) + + +def copy_pin_externals_wc_wc(sbox): + "svn copy --pin-externals wc->wc" + + external_url_for = externals_test_setup(sbox) + + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + repo_dir = sbox.repo_dir + other_repo_dir = repo_dir + ".other" + + external_youngest_rev = svntest.main.youngest(repo_dir) + other_external_youngest_rev = svntest.main.youngest(other_repo_dir) + + # Create a working copy. + svntest.actions.run_and_verify_svn(None, [], + 'checkout', + repo_url, wc_dir) + + # Perform a wc->wc copy, pinning externals + svntest.actions.run_and_verify_svn(None, [], + 'copy', + os.path.join(wc_dir, 'A'), + os.path.join(wc_dir, 'A_copy'), + '--pin-externals') + verify_pinned_externals(sbox, external_url_for, wc_dir, + external_youngest_rev, other_external_youngest_rev) + + +def copy_pin_externals_moved_external(sbox): + "pin externals which were moved since last changed" + + external_url_for = externals_test_setup(sbox) + + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + repo_dir = sbox.repo_dir + other_repo_dir = repo_dir + ".other" + + external_youngest_rev = svntest.main.youngest(repo_dir) + other_external_youngest_rev = svntest.main.youngest(other_repo_dir) + + # Create a working copy. + svntest.actions.run_and_verify_svn(None, [], + 'checkout', + repo_url, wc_dir) + + # Test behaviour for external URLs which were moved since + # their last-changed revision. + sbox.simple_move('A/D/gamma', 'A/D/gamma-moved') + sbox.simple_commit() + change_external(sbox.ospath('A/B'), '^/A/D/gamma-moved gamma', commit=True) + sbox.simple_update() + external_youngest_rev = svntest.main.youngest(repo_dir) + svntest.actions.run_and_verify_svn(None, [], + 'copy', + os.path.join(wc_dir, 'A'), + os.path.join(wc_dir, 'A_copy'), + '--pin-externals') + external_url_for["A/B/gamma"] = '^/A/D/gamma-moved' + verify_pinned_externals(sbox, external_url_for, wc_dir, + external_youngest_rev, other_external_youngest_rev) + + +def copy_pin_externals_removed_in_head(sbox): + "already pinned external which was removed in HEAD" + + external_url_for = externals_test_setup(sbox) + + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + repo_dir = sbox.repo_dir + other_repo_url = repo_url + ".other" + other_repo_dir = repo_dir + ".other" + + # Create a working copy. + svntest.actions.run_and_verify_svn(None, [], + 'checkout', + repo_url, wc_dir) + + # Test an already pinned external which was removed in HEAD. + svntest.actions.run_and_verify_svn(None, [], + 'rm', + other_repo_url + '/A/D/H', + '-m', 'remove A/D/H') + sbox.simple_update() + external_youngest_rev = svntest.main.youngest(repo_dir) + other_external_youngest_rev = svntest.main.youngest(other_repo_dir) + svntest.actions.run_and_verify_svn(None, [], + 'copy', + os.path.join(wc_dir, 'A'), + os.path.join(wc_dir, 'A_copy'), + '--pin-externals') + verify_pinned_externals(sbox, external_url_for, wc_dir, + external_youngest_rev, other_external_youngest_rev) + + +def copy_pin_externals_from_old_rev(sbox): + "copy from an old revision with pinning" + + external_url_for = externals_test_setup(sbox) + + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + repo_dir = sbox.repo_dir + other_repo_url = repo_url + ".other" + other_repo_dir = repo_dir + ".other" + + # Create a working copy. + svntest.actions.run_and_verify_svn(None, [], + 'checkout', + repo_url, wc_dir) + # Create a couple of revisions affecting 'A'. + for i in range(5): + svntest.main.file_append(sbox.ospath('A/mu'), 'a new line') + sbox.simple_commit() + sbox.simple_update() + + # Test a copy from an old revision with pinning. + external_youngest_rev = svntest.main.youngest(repo_dir) + other_external_youngest_rev = svntest.main.youngest(other_repo_dir) + svntest.actions.run_and_verify_svn(None, [], + 'copy', + os.path.join(wc_dir, 'A@6'), + os.path.join(wc_dir, 'A_copy'), + '--pin-externals') + external_url_for["A/B/gamma"] = '^/A/D/gamma' + verify_pinned_externals(sbox, external_url_for, wc_dir, + external_youngest_rev, other_external_youngest_rev) + + +def copy_pin_externals_wc_local_mods(sbox): + "cannot pin WC externals with local mods" + + external_url_for = externals_test_setup(sbox) + + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + + # Create a working copy. + svntest.actions.run_and_verify_svn(None, [], + 'checkout', + repo_url, wc_dir) + + svntest.main.file_append(sbox.ospath('A/C/exdir_G/pi'), 'this file changed') + expected_stderr = verify.RegexOutput(".*Cannot pin.*local modifications.*", + match_all=False) + svntest.actions.run_and_verify_svn(None, expected_stderr, + 'copy', + os.path.join(wc_dir, 'A'), + os.path.join(wc_dir, 'A_copy'), + '--pin-externals') + + +def copy_pin_externals_wc_switched_subtrees(sbox): + "cannot pin WC externals with switched subtrees" + + external_url_for = externals_test_setup(sbox) + + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + + # Create a working copy. + svntest.actions.run_and_verify_svn(None, [], + 'checkout', + repo_url, wc_dir) + + svntest.actions.run_and_verify_svn(None, [], + 'switch', '--ignore-ancestry', '^/A/B', + sbox.ospath('A/D/exdir_A/C')) + expected_stderr = verify.RegexOutput(".*Cannot pin.*switched subtree.*", + match_all=False) + svntest.actions.run_and_verify_svn(None, expected_stderr, + 'copy', + os.path.join(wc_dir, 'A'), + os.path.join(wc_dir, 'A_copy'), + '--pin-externals') + + +def copy_pin_externals_wc_mixed_revisions(sbox): + "cannot pin WC externals with mixed revisions" + + external_url_for = externals_test_setup(sbox) + + wc_dir = sbox.wc_dir + repo_url = sbox.repo_url + + # Create a working copy. + svntest.actions.run_and_verify_svn(None, [], + 'checkout', + repo_url, wc_dir) + + svntest.actions.run_and_verify_svn(None, [], + 'update', '-r1', + sbox.ospath('A/D/exdir_A/mu')) + expected_stderr = verify.RegexOutput(".*Cannot pin.*mixed-revision.*", + match_all=False) + svntest.actions.run_and_verify_svn(None, expected_stderr, + 'copy', + os.path.join(wc_dir, 'A'), + os.path.join(wc_dir, 'A_copy'), + '--pin-externals') + +@Issue(4558) +def copy_pin_externals_whitepace_dir(sbox): + "copy --pin-externals with whitepace dir" + + sbox.build(empty=True) + repo_url = sbox.repo_url + wc_dir = sbox.wc_dir + ss_path = repo_url[repo_url.find('//'):] + + extdef = sbox.get_tempname('extdef') + info = sbox.get_tempname('info') + + open(extdef, 'w').write( + '"' + ss_path +'/deps/sqlite" ext/sqlite\n' + + '"^/deps/A P R" \'ext/A P R\'\n' + + '^/deps/B\ D\ B\' ext/B\ D\ B\'\n' + + repo_url + '/deps/wors%23+t ext/wors#+t') + open(info, 'w').write('info\n') + + svntest.actions.run_and_verify_svnmucc(None, [], '-U', repo_url, + 'mkdir', 'trunk', + 'mkdir', 'branches', + 'mkdir', 'deps', + 'mkdir', 'deps/sqlite', + 'put', info, 'deps/sqlite/readme', + 'mkdir', 'deps/A P R', + 'put', info, 'deps/A P R/about', + 'mkdir', 'deps/B D B\'', + 'put', info, 'deps/B D B\'/copying', + 'mkdir', 'deps/wors#+t', + 'put', info, 'deps/wors#+t/brood', + 'propsetf', 'svn:externals', extdef, + 'trunk', + '-mm' + ) + + svntest.actions.run_and_verify_svn(None, [], 'update', sbox.ospath('trunk'), + '--ignore-externals') + sbox.simple_update('branches') + + expected_status = svntest.wc.State(wc_dir, { + '' : Item(status=' ', wc_rev='0'), + 'trunk' : Item(status=' ', wc_rev='1'), + 'branches' : Item(status=' ', wc_rev='1'), + }) + + svntest.actions.run_and_verify_status(wc_dir, expected_status) + + trunk_url = repo_url + '/trunk' + branches_url = repo_url + '/branches' + trunk_wc = sbox.ospath('trunk') + + # Create a new revision to creat interesting pinning revisions + sbox.simple_propset('A', 'B', 'trunk') + sbox.simple_commit('trunk') + + # And let's copy/pin + svntest.actions.run_and_verify_svn(None, [], + 'copy', '--pin-externals', + trunk_url, branches_url + '/url-url', '-mm') + + svntest.actions.run_and_verify_svn(None, [], + 'copy', '--pin-externals', + trunk_url, sbox.ospath('branches/url-wc')) + sbox.simple_commit('branches/url-wc') + + # Now try to copy without externals in the WC + expected_err = '.*E155035: Cannot pin external.*' + svntest.actions.run_and_verify_svn(None, expected_err, + 'copy', '--pin-externals', + trunk_wc, branches_url + '/wc-url', '-mm') + + svntest.actions.run_and_verify_svn(None, expected_err, + 'copy', '--pin-externals', + trunk_wc, sbox.ospath('branches/wc-wc')) + + # Bring in the externals on trunk + svntest.actions.run_and_verify_svn(None, [], 'update', sbox.ospath('trunk')) + expected_status = svntest.wc.State(wc_dir, { + 'trunk' : Item(status=' ', wc_rev='4'), + 'trunk/ext' : Item(status='X '), + 'trunk/ext/sqlite' : Item(status=' ', wc_rev='4'), + 'trunk/ext/sqlite/readme' : Item(status=' ', wc_rev='4'), + 'trunk/ext/A P R' : Item(status=' ', wc_rev='4'), + 'trunk/ext/A P R/about' : Item(status=' ', wc_rev='4'), + 'trunk/ext/B D B\'' : Item(status=' ', wc_rev='4'), + 'trunk/ext/B D B\'/copying' : Item(status=' ', wc_rev='4'), + 'trunk/ext/wors#+t' : Item(status=' ', wc_rev='4'), + 'trunk/ext/wors#+t/brood' : Item(status=' ', wc_rev='4'), + }) + svntest.actions.run_and_verify_status(sbox.ospath('trunk'), expected_status) + + # And copy again + svntest.actions.run_and_verify_svn(None, [], + 'copy', '--pin-externals', + trunk_wc, branches_url + '/wc-url', '-mm') + + svntest.actions.run_and_verify_svn(None, [], + 'copy', '--pin-externals', + trunk_wc, sbox.ospath('branches/wc-wc')) + sbox.simple_commit('branches/wc-wc') + + + expected_output = svntest.wc.State(wc_dir, { + 'branches/url-url' : Item(status='A '), + 'branches/url-url/ext/A P R/about' : Item(status='A '), + 'branches/url-url/ext/B D B\'/copying' : Item(status='A '), + 'branches/url-url/ext/wors#+t/brood' : Item(status='A '), + 'branches/url-url/ext/sqlite/readme' : Item(status='A '), + + # url-wc is already up to date + + 'branches/wc-url' : Item(status='A '), + 'branches/wc-url/ext/wors#+t/brood' : Item(status='A '), + 'branches/wc-url/ext/sqlite/readme' : Item(status='A '), + 'branches/wc-url/ext/B D B\'/copying' : Item(status='A '), + 'branches/wc-url/ext/A P R/about' : Item(status='A '), + + ## branches/wc-wc should checkout its externals here + }) + expected_status = svntest.wc.State(wc_dir, { + 'branches' : Item(status=' ', wc_rev='6'), + + 'branches/url-url' : Item(status=' ', wc_rev='6'), + 'branches/url-url/ext' : Item(status='X '), + 'branches/url-url/ext/A P R' : Item(status=' ', wc_rev='2'), + 'branches/url-url/ext/A P R/about' : Item(status=' ', wc_rev='2'), + 'branches/url-url/ext/sqlite' : Item(status=' ', wc_rev='2'), + 'branches/url-url/ext/sqlite/readme' : Item(status=' ', wc_rev='2'), + 'branches/url-url/ext/wors#+t' : Item(status=' ', wc_rev='2'), + 'branches/url-url/ext/wors#+t/brood' : Item(status=' ', wc_rev='2'), + 'branches/url-url/ext/B D B\'' : Item(status=' ', wc_rev='2'), + 'branches/url-url/ext/B D B\'/copying' : Item(status=' ', wc_rev='2'), + + 'branches/url-wc' : Item(status=' ', wc_rev='6'), + 'branches/url-wc/ext' : Item(status='X '), + 'branches/url-wc/ext/wors#+t' : Item(status=' ', wc_rev='3'), + 'branches/url-wc/ext/wors#+t/brood' : Item(status=' ', wc_rev='3'), + 'branches/url-wc/ext/B D B\'' : Item(status=' ', wc_rev='3'), + 'branches/url-wc/ext/B D B\'/copying' : Item(status=' ', wc_rev='3'), + 'branches/url-wc/ext/sqlite' : Item(status=' ', wc_rev='3'), + 'branches/url-wc/ext/sqlite/readme' : Item(status=' ', wc_rev='3'), + 'branches/url-wc/ext/A P R' : Item(status=' ', wc_rev='3'), + 'branches/url-wc/ext/A P R/about' : Item(status=' ', wc_rev='3'), + + 'branches/wc-url' : Item(status=' ', wc_rev='6'), + 'branches/wc-url/ext' : Item(status='X '), + 'branches/wc-url/ext/wors#+t' : Item(status=' ', wc_rev='4'), + 'branches/wc-url/ext/wors#+t/brood' : Item(status=' ', wc_rev='4'), + 'branches/wc-url/ext/sqlite' : Item(status=' ', wc_rev='4'), + 'branches/wc-url/ext/sqlite/readme' : Item(status=' ', wc_rev='4'), + 'branches/wc-url/ext/B D B\'' : Item(status=' ', wc_rev='4'), + 'branches/wc-url/ext/B D B\'/copying' : Item(status=' ', wc_rev='4'), + 'branches/wc-url/ext/A P R' : Item(status=' ', wc_rev='4'), + 'branches/wc-url/ext/A P R/about' : Item(status=' ', wc_rev='4'), + + 'branches/wc-wc' : Item(status=' ', wc_rev='6'), + 'branches/wc-wc/ext' : Item(status='X '), + 'branches/wc-wc/ext/wors#+t' : Item(status=' ', wc_rev='4'), + 'branches/wc-wc/ext/wors#+t/brood' : Item(status=' ', wc_rev='4'), + 'branches/wc-wc/ext/sqlite' : Item(status=' ', wc_rev='4'), + 'branches/wc-wc/ext/sqlite/readme' : Item(status=' ', wc_rev='4'), + 'branches/wc-wc/ext/B D B\'' : Item(status=' ', wc_rev='4'), + 'branches/wc-wc/ext/B D B\'/copying' : Item(status=' ', wc_rev='4'), + 'branches/wc-wc/ext/A P R' : Item(status=' ', wc_rev='4'), + 'branches/wc-wc/ext/A P R/about' : Item(status=' ', wc_rev='4'), + }) + svntest.actions.run_and_verify_update(wc_dir + '/branches', expected_output, + None, expected_status, []) + + # Now let's use our existing setup to perform some copies with dynamic + # destinations + svntest.actions.run_and_verify_svn(None, [], + 'copy', '--parents', '--pin-externals', + repo_url + '/branches/wc-url', + repo_url + '/branches/url-url', + trunk_url, + branches_url + '/3x-url-url', + '-mm') + + svntest.actions.run_and_verify_svn(None, [], + 'copy', '--parents', '--pin-externals', + repo_url + '/branches/wc-url', + repo_url + '/branches/url-url', + trunk_url, + sbox.ospath('branches/3x-url-wc')) + + svntest.actions.run_and_verify_svn(None, [], + 'copy', '--parents', '--pin-externals', + sbox.ospath('branches/wc-url'), + sbox.ospath('branches/url-url'), + sbox.ospath('trunk'), + branches_url + '/3x-wc-url', + '-mm') + + svntest.actions.run_and_verify_svn(None, [], + 'copy', '--parents', '--pin-externals', + sbox.ospath('branches/wc-url'), + sbox.ospath('branches/url-url'), + sbox.ospath('trunk'), + sbox.ospath('branches/3x-wc-wc')) + def nested_notification(sbox): "notification for nested externals" @@ -3638,6 +4171,17 @@ test_list = [ None, switch_relative_externals, copy_file_external_to_repo, replace_tree_with_foreign_external, + copy_pin_externals_repos_repos, + copy_pin_externals_repos_wc, + copy_pin_externals_wc_repos, + copy_pin_externals_wc_wc, + copy_pin_externals_moved_external, + copy_pin_externals_removed_in_head, + copy_pin_externals_from_old_rev, + copy_pin_externals_wc_local_mods, + copy_pin_externals_wc_switched_subtrees, + copy_pin_externals_wc_mixed_revisions, + copy_pin_externals_whitepace_dir, nested_notification, ] Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/lock_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/lock_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/lock_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/lock_tests.py Mon Feb 16 17:40:07 2015 @@ -1841,8 +1841,8 @@ def commit_stolen_lock(sbox): err_re, wc_dir) -# When removing directories, the locks of contained files were not -# correctly removed from the working copy database, thus they later +# When removing directories, the locks of contained files were not +# correctly removed from the working copy database, thus they later # magically reappeared when new files or directories with the same # pathes were added. @Issue(4364) @@ -1857,10 +1857,10 @@ def drop_locks_on_parent_deletion(sbox): sbox.simple_lock('A/B/E/alpha') sbox.simple_lock('A/B/E/beta') sbox.simple_rm('A/B') - + expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_status.remove_subtree('A/B') - + svntest.actions.run_and_verify_commit(wc_dir, [], expected_status, @@ -1874,7 +1874,7 @@ def drop_locks_on_parent_deletion(sbox): # The bug also resurrected locks on directories when their path # matched a former file. sbox.simple_mkdir('A/B/E', 'A/B/E/alpha') - + expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_status.tweak('A/B', 'A/B/E', @@ -1883,7 +1883,7 @@ def drop_locks_on_parent_deletion(sbox): 'A/B/lambda', wc_rev='3') expected_status.remove('A/B/E/beta') - + svntest.actions.run_and_verify_commit(wc_dir, [], expected_status, @@ -2147,7 +2147,7 @@ def non_root_locks(sbox): 'cp', sbox.repo_url, sbox.repo_url + '/X', '-m', 'copy greek tree') - sbox.simple_switch(sbox.repo_url + '/X') + sbox.simple_switch(sbox.repo_url + '/X') expected_status = svntest.actions.get_virginal_state(wc_dir, 2) svntest.actions.run_and_verify_status(wc_dir, expected_status) @@ -2336,20 +2336,20 @@ def lock_commit_bump(sbox): }) expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_status.tweak('A/mu', wc_rev=3) - + svntest.actions.run_and_verify_commit(wc_dir, expected_output, expected_status, None, wc_dir) # We explicitly check both the Revision and Last Changed Revision. - expected_infos = [ { + expected_infos = [ { 'Revision' : '1' , 'Last Changed Rev' : '1' , 'URL' : '.*', 'Lock Token' : None, } ] - svntest.actions.run_and_verify_info(expected_infos, + svntest.actions.run_and_verify_info(expected_infos, sbox.ospath('iota')) def copy_dir_with_locked_file(sbox): @@ -2372,6 +2372,44 @@ def copy_dir_with_locked_file(sbox): 'mv', A_url, AA2_url, '-m', '') +@Issue(4557) +@XFail(svntest.main.is_ra_type_dav) +def delete_dir_with_lots_of_locked_files(sbox): + "delete a directory containing lots of locked files" + + sbox.build() + wc_dir = sbox.wc_dir + + # A lot of paths. + nfiles = 75 # NOTE: test XPASSES with 50 files!!! + locked_paths = [] + for i in range(nfiles): + locked_paths.append("A/locked_files/file-%i" % i) + + # Create files at these paths + os.mkdir(sbox.ospath("A/locked_files")) + for file_path in locked_paths: + svntest.main.file_write(sbox.ospath(file_path), "This is a file\n") + sbox.simple_add("A/locked_files") + sbox.simple_commit() + sbox.simple_update() + + # lock all the files + for file_path in locked_paths: + svntest.actions.run_and_verify_svn(None, [], 'lock', + '--username', 'jrandom', + '-m', 'lock %s' % file_path, + sbox.ospath(file_path)) + # Locally delete A + sbox.simple_rm("A") + + # Commit the deletion + # XFAIL: As of 1.8.10, this commit fails with: + # svn: E175002: Unexpected HTTP status 400 'Bad Request' on '<path>' + # and the following error in the httpd error log: + # request failed: error reading the headers + # This problem was introduced on the 1.8.x branch in r1606976. + sbox.simple_commit() ######################################################################## # Run the tests @@ -2438,6 +2476,7 @@ test_list = [ None, delete_locked_file_with_percent, lock_commit_bump, copy_dir_with_locked_file, + delete_dir_with_lots_of_locked_files, ] if __name__ == '__main__': Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tests.py Mon Feb 16 17:40:07 2015 @@ -18505,7 +18505,7 @@ def merge_to_empty_target_merge_to_infin C1_path = sbox.ospath('A/C/C1') test3_path = sbox.ospath('A/C/C1/test.txt') - + # r3 - Add some subtrees: # A /A/B/B1 # A /A/B/B1/B1a Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tree_conflict_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tree_conflict_tests.py?rev=1660173&r1=1660172&r2=1660173&view=diff ============================================================================== --- subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tree_conflict_tests.py (original) +++ subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_tree_conflict_tests.py Mon Feb 16 17:40:07 2015 @@ -1949,6 +1949,159 @@ def merge_replace_on_del_fails(sbox): actions.run_and_verify_svn2(expected_stdout, [], 0, 'merge', sbox.repo_url + '/A', branch_path) +def merge_conflict_details(sbox): + "merge conflict details" + + sbox.build() + wc_dir = sbox.wc_dir + + sbox.simple_append('A/B/E/new', 'new\n') + sbox.simple_add('A/B/E/new') + sbox.simple_append('A/B/E/alpha', '\nextra\nlines\n') + sbox.simple_rm('A/B/E/beta', 'A/B/F') + sbox.simple_propset('key', 'VAL', 'A/B/E', 'A/B') + sbox.simple_mkdir('A/B/E/new-dir1') + sbox.simple_mkdir('A/B/E/new-dir2') + sbox.simple_mkdir('A/B/E/new-dir3') + sbox.simple_rm('A/B/lambda') + sbox.simple_mkdir('A/B/lambda') + sbox.simple_commit() + + sbox.simple_update('', 1) + + sbox.simple_move('A/B', 'B') + + sbox.simple_propset('key', 'vAl', 'B') + sbox.simple_move('B/E/beta', 'beta') + sbox.simple_propset('a', 'b', 'B/F', 'B/lambda') + sbox.simple_append('B/E/alpha', 'other\nnew\nlines') + sbox.simple_mkdir('B/E/new') + sbox.simple_mkdir('B/E/new-dir1') + sbox.simple_append('B/E/new-dir2', 'something') + sbox.simple_append('B/E/new-dir3', 'something') + sbox.simple_add('B/E/new-dir3') + + expected_status = svntest.actions.get_virginal_state(wc_dir, 1) + expected_status.add({ + 'B' : Item(status=' C', copied='+', moved_from='A/B', + wc_rev='-', entry_status='AC'), + 'B/E' : Item(status=' M', copied='+', wc_rev='-'), + 'B/E/new' : Item(status='A ', treeconflict='C', wc_rev='-'), + 'B/E/beta' : Item(status='D ', copied='+', treeconflict='C', + wc_rev='-', moved_to='beta'), + 'B/E/alpha' : Item(status='C ', copied='+', wc_rev='-'), + 'B/E/new-dir3' : Item(status='A ', treeconflict='C', wc_rev='-'), + 'B/E/new-dir1' : Item(status='A ', treeconflict='C', wc_rev='-'), + 'B/F' : Item(status=' M', copied='+', treeconflict='C', + wc_rev='-'), + 'B/lambda' : Item(status=' M', copied='+', treeconflict='C', + wc_rev='-'), + 'beta' : Item(status='A ', copied='+', + moved_from='B/E/beta', wc_rev='-') + }) + expected_status.tweak('A/B', status='D ', wc_rev='1', moved_to='B') + expected_status.tweak('A/B/lambda', 'A/B/E', 'A/B/E/beta', 'A/B/E/alpha', + 'A/B/F', status='D ') + + expected_output = svntest.wc.State(wc_dir, { + 'B' : Item(status=' C'), + 'B/E' : Item(status=' U'), + 'B/E/new' : Item(status=' ', treeconflict='C'), + 'B/E/beta' : Item(status=' ', treeconflict='C'), + 'B/E/alpha' : Item(status='C '), + 'B/E/new-dir3' : Item(status=' ', treeconflict='C'), + 'B/E/new-dir1' : Item(status=' ', treeconflict='C'), + 'B/F' : Item(status=' ', treeconflict='C'), + 'B/lambda' : Item(status=' ', treeconflict='C'), + }) + expected_skip = wc.State(wc_dir, { + 'B/E/new-dir2' : Item(verb='Skipped'), + }) + svntest.actions.run_and_verify_merge(sbox.ospath('B'), + 1, 2, '^/A/B', '^/A/B', + expected_output, + None, None, + None, None, expected_skip) + svntest.actions.run_and_verify_status(wc_dir, expected_status) + + expected_info = [ + { + "Path" : re.escape(sbox.ospath('B')), + + "Conflict Properties File" : + re.escape(sbox.ospath('B/dir_conflicts.prej')) + '.*', + "Conflict Details": re.escape( + 'incoming dir edit upon merge' + + ' Source left: (dir) ^/A/B@1' + + ' Source right: (dir) ^/A/B@2') + }, + { + "Path" : re.escape(sbox.ospath('B/E')), + }, + { + "Path" : re.escape(sbox.ospath('B/E/alpha')), + "Conflict Previous Base File" : '.*alpha.*', + "Conflict Previous Working File" : '.*alpha.*', + "Conflict Current Base File": '.*alpha.*', + "Conflict Details": re.escape( + 'incoming file edit upon merge' + + ' Source left: (file) ^/A/B/E/alpha@1' + + ' Source right: (file) ^/A/B/E/alpha@2') + }, + { + "Path" : re.escape(sbox.ospath('B/E/beta')), + "Tree conflict": re.escape( + 'local file moved away, incoming file delete or move upon merge' + + ' Source left: (file) ^/A/B/E/beta@1' + + ' Source right: (none) ^/A/B/E/beta@2') + }, + { + "Path" : re.escape(sbox.ospath('B/E/new')), + "Tree conflict": re.escape( + 'local dir add, incoming file add upon merge' + + ' Source left: (none) ^/A/B/E/new@1' + + ' Source right: (file) ^/A/B/E/new@2') + }, + { + "Path" : re.escape(sbox.ospath('B/E/new-dir1')), + "Tree conflict": re.escape( + 'local dir add, incoming dir add upon merge' + + ' Source left: (none) ^/A/B/E/new-dir1@1' + + ' Source right: (dir) ^/A/B/E/new-dir1@2') + }, + #{ ### Skipped + # "Path" : re.escape(sbox.ospath('B/E/new-dir2')), + # "Tree conflict": re.escape( + # 'local file unversioned, incoming dir add upon merge' + + # ' Source left: (none) ^/A/B/E/new-dir2@1' + + # ' Source right: (dir) ^/A/B/E/new-dir2@2') + #}, + { + "Path" : re.escape(sbox.ospath('B/E/new-dir3')), + "Tree conflict": re.escape( + 'local file add, incoming dir add upon merge' + + ' Source left: (none) ^/A/B/E/new-dir3@1' + + ' Source right: (dir) ^/A/B/E/new-dir3@2') + }, + { + "Path" : re.escape(sbox.ospath('B/F')), + "Tree conflict": re.escape( + 'local dir edit, incoming dir delete or move upon merge' + + ' Source left: (dir) ^/A/B/F@1' + + ' Source right: (none) ^/A/B/F@2') + }, + { + "Path" : re.escape(sbox.ospath('B/lambda')), + "Tree conflict": re.escape( + 'local file edit, incoming replace with dir upon merge' + + ' Source left: (file) ^/A/B/lambda@1' + + ' Source right: (dir) ^/A/B/lambda@2') + }, + ] + + svntest.actions.run_and_verify_info(expected_info, sbox.ospath('B'), + '--depth', 'infinity') + ######################################################################## # Run the tests @@ -1979,6 +2132,7 @@ test_list = [ None, merge_replace_causes_tree_conflict, merge_replace_causes_tree_conflict2, merge_replace_on_del_fails, + merge_conflict_details, ] if __name__ == '__main__':
