You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2015/02/16 18:40:11 UTC
svn commit: r1660173 [8/10] - in /subversion/branches/move-tracking-2: ./
build/ build/generator/ contrib/ contrib/client-side/svncopy/ notes/
subversion/ subversion/bindings/javahl/native/
subversion/bindings/javahl/src/org/apache/subversion/javahl/ s...
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__':