Modified: subversion/branches/reuse-ra-session/subversion/svn/cl.h URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/cl.h?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/cl.h (original) +++ subversion/branches/reuse-ra-session/subversion/svn/cl.h Wed Feb 25 08:15:39 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; @@ -296,8 +297,7 @@ svn_opt_subcommand_t svn_cl__switch, svn_cl__unlock, svn_cl__update, - svn_cl__upgrade, - svn_cl__youngest; + svn_cl__upgrade; /* See definition in svn.c for documentation. */
Modified: subversion/branches/reuse-ra-session/subversion/svn/commit-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/commit-cmd.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/commit-cmd.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/commit-cmd.c Wed Feb 25 08:15:39 2015 @@ -137,7 +137,9 @@ svn_cl__commit(apr_getopt_t *os, if (opt_state->depth == svn_depth_unknown) opt_state->depth = svn_depth_infinity; - cfg = svn_hash_gets(ctx->config, SVN_CONFIG_CATEGORY_CONFIG); + cfg = ctx->config + ? svn_hash_gets(ctx->config, SVN_CONFIG_CATEGORY_CONFIG) + : NULL; if (cfg) SVN_ERR(svn_config_get_bool(cfg, &no_unlock, SVN_CONFIG_SECTION_MISCELLANY, Modified: subversion/branches/reuse-ra-session/subversion/svn/copy-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/copy-cmd.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/copy-cmd.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/copy-cmd.c Wed Feb 25 08:15:39 2015 @@ -167,8 +167,11 @@ 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, + FALSE /* metadata_only */, + 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/reuse-ra-session/subversion/svn/diff-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/diff-cmd.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/diff-cmd.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/diff-cmd.c Wed Feb 25 08:15:39 2015 @@ -344,7 +344,7 @@ svn_cl__diff(apr_getopt_t *os, { ignore_content_type = TRUE; } - else + else if (ctx->config) { SVN_ERR(svn_config_get_bool(svn_hash_gets(ctx->config, SVN_CONFIG_CATEGORY_CONFIG), @@ -353,6 +353,10 @@ svn_cl__diff(apr_getopt_t *os, SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE, FALSE)); } + else + { + ignore_content_type = FALSE; + } svn_opt_push_implicit_dot_target(targets, pool); Modified: subversion/branches/reuse-ra-session/subversion/svn/info-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/info-cmd.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/info-cmd.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/info-cmd.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svn/mergeinfo-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/mergeinfo-cmd.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/mergeinfo-cmd.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/mergeinfo-cmd.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svn/notify.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/notify.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/notify.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/notify.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svn/propget-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/propget-cmd.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/propget-cmd.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/propget-cmd.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svn/status.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/status.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/status.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/status.c Wed Feb 25 08:15:39 2015 @@ -138,37 +138,38 @@ generate_status_desc(enum svn_wc_status_ /* Make a relative path containing '..' elements as needed. TARGET_ABSPATH shall be the absolute version of TARGET_PATH. - TARGET_ABSPATH, TARGET_PATH and PATH shall be canonical. + TARGET_ABSPATH, TARGET_PATH and LOCAL_ABSPATH shall be canonical If above conditions are met, a relative path that leads to PATH from TARGET_PATH is returned, but there is no error checking involved. The returned path is allocated from RESULT_POOL, all other - allocations are made in SCRATCH_POOL. */ + allocations are made in SCRATCH_POOL. + + Note that it is not possible to just join the resulting path to + reconstruct the real path as the "../" paths are relative from + a different base than the normal relative paths! + */ static const char * make_relpath(const char *target_abspath, const char *target_path, - const char *path, + const char *local_abspath, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { const char *la; const char *parent_dir_els = ""; - const char *abspath, *relative; - svn_error_t *err = svn_dirent_get_absolute(&abspath, path, scratch_pool); + const char *t_relpath; + const char *p_relpath; - if (err) - { - /* We probably got passed some invalid path. */ - svn_error_clear(err); - return apr_pstrdup(result_pool, path); - } +#ifdef SVN_DEBUG + SVN_ERR_ASSERT_NO_RETURN(svn_dirent_is_absolute(local_abspath)); +#endif - relative = svn_dirent_skip_ancestor(target_abspath, abspath); - if (relative) - { - return svn_dirent_join(target_path, relative, result_pool); - } + t_relpath = svn_dirent_skip_ancestor(target_abspath, local_abspath); + + if (t_relpath) + return svn_dirent_join(target_path, t_relpath, result_pool); /* An example: * relative_to_path = /a/b/c @@ -180,17 +181,16 @@ make_relpath(const char *target_abspath, * path = C:/wc * result = C:/wc */ - /* Skip the common ancestor of both paths, here '/a'. */ - la = svn_dirent_get_longest_ancestor(target_abspath, abspath, + la = svn_dirent_get_longest_ancestor(target_abspath, local_abspath, scratch_pool); if (*la == '\0') { /* Nothing in common: E.g. C:/ vs F:/ on Windows */ - return apr_pstrdup(result_pool, path); + return apr_pstrdup(result_pool, local_abspath); } - relative = svn_dirent_skip_ancestor(la, target_abspath); - path = svn_dirent_skip_ancestor(la, path); + t_relpath = svn_dirent_skip_ancestor(la, target_abspath); + p_relpath = svn_dirent_skip_ancestor(la, local_abspath); /* In above example, we'd now have: * relative_to_path = b/c @@ -198,14 +198,14 @@ make_relpath(const char *target_abspath, /* Count the elements of relative_to_path and prepend as many '..' elements * to path. */ - while (*relative) + while (*t_relpath) { - svn_dirent_split(&relative, NULL, relative, - scratch_pool); + t_relpath = svn_dirent_dirname(t_relpath, scratch_pool); parent_dir_els = svn_dirent_join(parent_dir_els, "..", scratch_pool); } - return svn_dirent_join(parent_dir_els, path, result_pool); + /* This returns a ../ style path relative from the status target */ + return svn_dirent_join(parent_dir_els, p_relpath, result_pool); } @@ -232,8 +232,6 @@ print_status(const char *target_abspath, const char *moved_from_line = ""; const char *moved_to_line = ""; - path = make_relpath(target_abspath, target_path, path, pool, pool); - /* For historic reasons svn ignores the property status for added nodes, even if these nodes were copied and have local property changes. @@ -487,8 +485,6 @@ svn_cl__print_status_xml(const char *tar SVN_ERR(svn_wc_conflicted_p3(NULL, NULL, &tree_conflicted, ctx->wc_ctx, local_abspath, pool)); - path = make_relpath(target_abspath, target_path, path, pool, pool); - svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "entry", "path", svn_dirent_local_style(path, pool), SVN_VA_NULL); Modified: subversion/branches/reuse-ra-session/subversion/svn/svn.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/svn.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/svn.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/svn.c Wed Feb 25 08:15:39 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,16 +503,31 @@ 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_ - ("Output the content of specified files or\n" - "URLs with revision and author information in-line.\n" - "usage: blame TARGET[@REV]...\n" + ("Show when each line of a file was last (or\n" + "next) changed.\n" + "usage: blame [-rM:N] TARGET[@REV]...\n" + "\n" + " Annotate each line of a file with the revision number and author of the\n" + " last change (or optionally the next change) to that line.\n" + "\n" + " With no revision range (same as -r0:REV), or with '-r M:N' where M < N,\n" + " annotate each line that is present in revision N of the file, with\n" + " the last revision at or before rN that changed or added the line,\n" + " looking back no further than rM.\n" + "\n" + " With a reverse revision range '-r M:N' where M > N,\n" + " annotate each line that is present in revision N of the file, with\n" + " the next revision after rN that changed or deleted the line,\n" + " looking forward no further than rM.\n" "\n" " If specified, REV determines in which revision the target is first\n" - " looked up.\n"), + " looked up.\n" + "\n" + " Write the annotated result to standard output.\n"), {'r', 'v', 'g', opt_incremental, opt_xml, 'x', opt_force} }, { "cat", svn_cl__cat, {0}, N_ @@ -608,7 +628,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" @@ -1717,14 +1738,6 @@ const svn_opt_subcommand_desc2_t svn_cl_ " Local modifications are preserved.\n"), { 'q' } }, - { "youngest", svn_cl__youngest, {0}, N_ - ("Print the youngest revision number of a target's repository.\n" - "usage: youngest [TARGET]\n" - "\n" - " Print the revision number of the youngest revision in the repository\n" - " with which TARGET is associated.\n"), - { opt_no_newline } }, - { NULL, NULL, {0}, NULL, {0} } }; @@ -2390,6 +2403,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/reuse-ra-session/subversion/svn/util.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svn/util.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svn/util.c (original) +++ subversion/branches/reuse-ra-session/subversion/svn/util.c Wed Feb 25 08:15:39 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, @@ -197,7 +204,7 @@ svn_cl__make_log_msg_baton(void **baton, apr_hash_t *config, apr_pool_t *pool) { - struct log_msg_baton *lmb = apr_palloc(pool, sizeof(*lmb)); + struct log_msg_baton *lmb = apr_pcalloc(pool, sizeof(*lmb)); if (opt_state->filedata) { @@ -230,8 +237,10 @@ svn_cl__make_log_msg_baton(void **baton, SVN_CONFIG_OPTION_LOG_ENCODING, NULL); } + else + lmb->message_encoding = NULL; - lmb->base_dir = base_dir ? base_dir : ""; + lmb->base_dir = base_dir; lmb->tmpfile_left = NULL; lmb->config = config; lmb->keep_locks = opt_state->no_unlock; @@ -383,14 +392,11 @@ svn_cl__get_log_message(const char **log if (! path) path = item->url; - else if (! *path) - path = "."; - - if (! svn_path_is_url(path) && lmb->base_dir) + else if (lmb->base_dir) path = svn_dirent_is_child(lmb->base_dir, path, pool); /* If still no path, then just use current directory. */ - if (! path) + if (! path || !*path) path = "."; if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE) @@ -429,7 +435,8 @@ svn_cl__get_log_message(const char **log if (! lmb->non_interactive) { err = svn_cmdline__edit_string_externally(&msg_string, &lmb->tmpfile_left, - lmb->editor_cmd, lmb->base_dir, + lmb->editor_cmd, + lmb->base_dir ? lmb->base_dir : "", msg_string, "svn-commit", lmb->config, TRUE, lmb->message_encoding, Modified: subversion/branches/reuse-ra-session/subversion/svnadmin/svnadmin.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svnadmin/svnadmin.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svnadmin/svnadmin.c (original) +++ subversion/branches/reuse-ra-session/subversion/svnadmin/svnadmin.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svndumpfilter/svndumpfilter.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svndumpfilter/svndumpfilter.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svndumpfilter/svndumpfilter.c (original) +++ subversion/branches/reuse-ra-session/subversion/svndumpfilter/svndumpfilter.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svnrdump/dump_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svnrdump/dump_editor.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svnrdump/dump_editor.c (original) +++ subversion/branches/reuse-ra-session/subversion/svnrdump/dump_editor.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svnserve/logger.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svnserve/logger.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svnserve/logger.c (original) +++ subversion/branches/reuse-ra-session/subversion/svnserve/logger.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svnserve/serve.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svnserve/serve.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svnserve/serve.c (original) +++ subversion/branches/reuse-ra-session/subversion/svnserve/serve.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svnserve/server.h URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svnserve/server.h?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svnserve/server.h (original) +++ subversion/branches/reuse-ra-session/subversion/svnserve/server.h Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/svnserve/svnserve.c URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/svnserve/svnserve.c?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/svnserve/svnserve.c (original) +++ subversion/branches/reuse-ra-session/subversion/svnserve/svnserve.c Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/tests/cmdline/README URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/README?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/README (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/README Wed Feb 25 08:15:39 2015 @@ -180,8 +180,8 @@ or if you're running an individual test, $ ./basic_tests.py --url=svn://localhost --enable-sasl 3 -Note that to do this you'll have to have a subversion.conf file in your -SASL lib dir (i.e. something like /usr/lib/sasl2/subversion.conf), it +Note that to do this you'll have to have a svn.conf file in your +SASL lib dir (i.e. something like /usr/lib/sasl2/svn.conf), it should contain something like: pwcheck_method: auxprop @@ -195,6 +195,16 @@ $ saslpasswd2 -c -u svntest jconstant As usual, both users should use the password 'rayjandom'. +To enable DUMP_LOAD_CROSS_CHECK to work a third user is required, + +$ saslpasswd2 -c -u svntest __dumpster__ + +with password '__loadster__'. + +The user running the tests will need read access to the sasl database +and on some systems this can be arranged by adding the user to the sasl +group. + There are 'make svnserveautocheck' and ./svnserveautocheck.sh commands, analogous to davautocheck.sh documented above. Modified: subversion/branches/reuse-ra-session/subversion/tests/cmdline/basic_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/basic_tests.py?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/basic_tests.py (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/basic_tests.py Wed Feb 25 08:15:39 2015 @@ -3083,32 +3083,6 @@ def peg_rev_on_non_existent_wc_path(sbox 'cat', '-r2', sbox.ospath('mu3') + '@3') -@Issue(4299) -def basic_youngest(sbox): - 'basic youngest' - - sbox.build(read_only=True) - - repos_url = sbox.repo_url - deep_repos_url = repos_url + '/A/D/G' - - wc_dir = sbox.wc_dir - deep_wc_dir = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha') - bad_wc_dir = os.path.join(wc_dir, 'Z') - - svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, - 'youngest', bad_wc_dir) - - for flag, output in [(False, "1\n"), (True, "1")]: - for path in [repos_url, deep_repos_url, wc_dir, deep_wc_dir]: - if flag: - svntest.actions.run_and_verify_svn([output], [], - 'youngest', '--no-newline', path) - else: - svntest.actions.run_and_verify_svn([output], [], - 'youngest', path) - - # With 'svn mkdir --parents' the target directory may already exist on disk. # In that case it was wrongly performing a recursive 'add' on its contents. def mkdir_parents_target_exists_on_disk(sbox): @@ -3202,7 +3176,6 @@ test_list = [ None, rm_missing_with_case_clashing_ondisk_item, delete_conflicts_one_of_many, peg_rev_on_non_existent_wc_path, - basic_youngest, mkdir_parents_target_exists_on_disk, ] Modified: subversion/branches/reuse-ra-session/subversion/tests/cmdline/blame_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/blame_tests.py?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/blame_tests.py (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/blame_tests.py Wed Feb 25 08:15:39 2015 @@ -748,7 +748,7 @@ def blame_output_after_merge(sbox): # Next test with the -g option with -rN:M expected_output = [ " - - New version of file 'mu'.\n", " - - 2nd line in file 'mu'.\n", - "G - - new 3rd line in file 'mu'.\n", + "G 5 jrandom new 3rd line in file 'mu'.\n", "G 6 jrandom add 3.5 line in file 'mu'.\n", " - - 4th line in file 'mu'.\n", " - - 5th line in file 'mu'.\n", @@ -950,23 +950,115 @@ def blame_youngest_to_oldest(sbox): orig_line = open(iota).read() line = "New contents for iota\n" svntest.main.file_append(iota, line) - sbox.simple_commit() - + sbox.simple_commit() #r2 + # 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() - + sbox.simple_commit() #r3 + # Delete a line. open(iota_moved, 'w').write(line) - sbox.simple_commit() + sbox.simple_commit() #r4 expected_output = [ - ' %d jrandom %s\n' % (3, orig_line[:-1]), + ' %d jrandom %s\n' % (4, orig_line[:-1]), ] svntest.actions.run_and_verify_svn(expected_output, [], 'blame', '-r4:1', iota_moved) + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-rHEAD:1', iota_moved) + + expected_output = [ + ' %d jrandom %s\n' % (2, line[:-1]), + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-r1:HEAD', iota_moved) + +@Issue(4467) +def blame_reverse_no_change(sbox): + "blame reverse towards a revision with no change" + + sbox.build() + + # Introduce a revision where iota doesn't change! + sbox.simple_propset('a', 'b', 'A') + sbox.simple_commit('') #r2 + + sbox.simple_append('iota', 'new line\n') + sbox.simple_commit('') #r3 + + sbox.simple_append('iota', 'another new line\n') + sbox.simple_commit('') #r4 + + expected_output = [ + ' - - This is the file \'iota\'.\n', + ' 3 jrandom new line\n', + ' 4 jrandom another new line\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-r2:HEAD', sbox.ospath('iota')) + + expected_output = [ + ' - - This is the file \'iota\'.\n', + ] + # This used to trigger an assertion on 1.9.x before 1.9.0 + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-rHEAD:2', sbox.ospath('iota')) + + # Drop the middle line + sbox.simple_append('iota', 'This is the file \'iota\'.\n' + 'another new line\n', truncate=True) + sbox.simple_commit('') #r5 + + # Back to start + sbox.simple_append('iota', 'This is the file \'iota\'.\n', truncate=True) + sbox.simple_commit('') #r6 + + expected_output = [ + ' - - This is the file \'iota\'.\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-rHEAD:2', sbox.ospath('iota')) + + expected_output = [ + ' - - This is the file \'iota\'.\n', + ' 5 jrandom new line\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-rHEAD:3', sbox.ospath('iota')) + + expected_output = [ + ' - - This is the file \'iota\'.\n', + ' 5 jrandom new line\n', + ' 6 jrandom another new line\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-rHEAD:4', sbox.ospath('iota')) + + expected_output = [ + ' - - This is the file \'iota\'.\n', + ' 6 jrandom another new line\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-rHEAD:5', sbox.ospath('iota')) + + expected_output = [ + ' - - This is the file \'iota\'.\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-rHEAD:6', sbox.ospath('iota')) + + + expected_output = [ + ' - - This is the file \'iota\'.\n', + ' 5 jrandom new line\n', + ] + svntest.actions.run_and_verify_svn(expected_output, [], + 'blame', '-r5:3', sbox.ospath('iota')) + + ######################################################################## # Run the tests @@ -991,6 +1083,7 @@ test_list = [ None, blame_multiple_targets, blame_eol_handling, blame_youngest_to_oldest, + blame_reverse_no_change, ] if __name__ == '__main__': Modified: subversion/branches/reuse-ra-session/subversion/tests/cmdline/checkout_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/checkout_tests.py?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/checkout_tests.py (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/checkout_tests.py Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/tests/cmdline/commit_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/commit_tests.py?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/commit_tests.py (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/commit_tests.py Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/tests/cmdline/copy_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/copy_tests.py?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/copy_tests.py (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/copy_tests.py Wed Feb 25 08:15:39 2015 @@ -1005,8 +1005,7 @@ def repos_to_wc(sbox): expected_output = svntest.actions.get_virginal_state(wc_dir, 1) expected_output.add({ - 'pi' : Item(status='A ', wc_rev='0', entry_rev='1'), - # And from the foreign repository + 'pi' : Item(status='A ', wc_rev='0'), 'E' : Item(status='A ', wc_rev='0'), 'E/beta' : Item(status='A ', wc_rev='0'), 'E/alpha' : Item(status='A ', wc_rev='0'), @@ -1762,7 +1761,34 @@ def mixed_wc_to_url(sbox): 'mkdir', Y_path) # Now copy local A/D/G to create new directory A/D/Z the repository. - svntest.actions.run_and_verify_svn(None, [], + + expected_status = svntest.wc.State(G_path, { + '' : Item(status=' ', wc_rev='1'), + 'X' : Item(status='A ', copied='+', wc_rev='-'), + 'X/F' : Item(status=' ', copied='+', wc_rev='-'), + 'X/E' : Item(status=' ', copied='+', wc_rev='-'), + 'X/E/alpha' : Item(status='D ', copied='+', wc_rev='-'), + 'X/E/beta' : Item(status=' ', copied='+', wc_rev='-'), + 'X/lambda' : Item(status=' ', copied='+', wc_rev='-'), + 'Y' : Item(status='A ', wc_rev='-'), + 'rho' : Item(status='M ', wc_rev='3'), + 'tau' : Item(status=' ', wc_rev='1'), + }) + + svntest.actions.run_and_verify_status(G_path, expected_status) + + expected_output = svntest.verify.UnorderedOutput([ + 'Adding copy of %s\n' % sbox.ospath('A/D/G'), + 'Adding copy of %s\n' % sbox.ospath('A/D/G/X'), + 'Deleting copy of %s\n' % sbox.ospath('A/D/G/X/E/alpha'), + 'Adding copy of %s\n' % sbox.ospath('A/D/G/Y'), + 'Deleting copy of %s\n' % sbox.ospath('A/D/G/pi'), + 'Replacing copy of %s\n' % sbox.ospath('A/D/G/rho'), + 'Transmitting file data .done\n', + 'Committing transaction...\n', + 'Committed revision 4.\n', + ]) + svntest.actions.run_and_verify_svn(expected_output, [], 'cp', '-m', "Make a copy.", G_path, Z_url) expected_output = svntest.verify.UnorderedOutput([ @@ -5430,6 +5456,13 @@ def copy_and_move_conflicts(sbox): 'D/G/pi', 'D/G/rho', 'D/G/tau') + expected_status.tweak('B', moved_from='../A/B') + expected_status.tweak('D', moved_from='../A/D') + expected_status.tweak('H', moved_from='D/H') + expected_status.tweak('Q', moved_from='../A/Q') + expected_status.tweak('D/H', moved_to='H') + expected_status.tweak('alpha', moved_from='B/E/alpha') + expected_status.tweak('B/E/alpha', moved_to='alpha') svntest.actions.run_and_verify_status(wc('move-dest'), expected_status) expected_disk = svntest.wc.State('', { Modified: subversion/branches/reuse-ra-session/subversion/tests/cmdline/dav-mirror-autocheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/dav-mirror-autocheck.sh?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/dav-mirror-autocheck.sh (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/dav-mirror-autocheck.sh Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/tests/cmdline/davautocheck.sh URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/davautocheck.sh?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/davautocheck.sh (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/davautocheck.sh Wed Feb 25 08:15:39 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/reuse-ra-session/subversion/tests/cmdline/depth_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/depth_tests.py?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/depth_tests.py (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/depth_tests.py Wed Feb 25 08:15:39 2015 @@ -1955,22 +1955,29 @@ def fold_tree_with_unversioned_modified_ # Fold the A dir to empty, expect the modified & unversioned ones left # unversioned rather than removed, along with paths to those items. - # Even though the directory B and D is not deleted because of local - # modificatoin or unversioned items, there will be only one notification at - # B and D. + # Directories B and D won't be deleted, because that would remove their + # local modifications. Their unmodified descendants are deleted though. expected_output = svntest.wc.State(wc_dir, { - 'A/B' : Item(status='D '), + 'A/B/E' : Item(status='D '), + 'A/B/F' : Item(status='D '), + 'A/B/lambda' : Item(status='D '), 'A/C' : Item(status='D '), - 'A/D' : Item(status='D '), - 'A/mu' : Item(status='D '), + 'A/D/G/rho' : Item(status='D '), + 'A/D/G/tau' : Item(status='D '), + 'A/D/H' : Item(status='D '), + 'A/D/gamma' : Item(status='D '), }) # unversioned items will be ignored in in the status tree, since the # run_and_verify_update() function uses a quiet version of svn status - # Dir A is still versioned, since the wc root is in depth-infinity expected_status = svntest.wc.State(wc_dir, { '' : Item(status=' ', wc_rev=1), 'iota' : Item(status=' ', wc_rev=1), - 'A' : Item(status=' ', wc_rev=1) + 'A' : Item(status=' ', wc_rev=1), + 'A/D' : Item(status=' ', wc_rev='1'), + 'A/D/G' : Item(status=' ', wc_rev='1'), + 'A/D/G/pi' : Item(status='M ', wc_rev='1'), + 'A/B' : Item(status=' ', wc_rev='1'), + 'A/mu' : Item(status='M ', wc_rev='1'), }) expected_disk = svntest.wc.State('', { 'iota' : Item(contents="This is the file 'iota'.\n"), @@ -2886,6 +2893,82 @@ def spurious_nodes_row(sbox): # ra_neon added a spurious not-present row that does not show up in status raise svntest.Failure("count changed from '%s' to '%s'" % (val1, val2)) +def commit_excluded(sbox): + "commit an excluded node" + + sbox.build() + wc_dir = sbox.wc_dir + + expected_output = svntest.wc.State(wc_dir, { + 'A/D/G' : Item(status='D '), + }) + expected_status = svntest.actions.get_virginal_state(wc_dir, 1) + expected_status.remove('A/D/G', 'A/D/G/pi', 'A/D/G/rho', 'A/D/G/tau') + + svntest.actions.run_and_verify_update(wc_dir, + expected_output, + None, + expected_status, + None, None, None, None, None, False, + "--set-depth=exclude", + sbox.ospath('A/D/G')) + + sbox.simple_copy('A/D', 'D') + + expected_output = svntest.wc.State(wc_dir, { + 'D' : Item(verb='Adding'), + }) + + expected_status.add({ + 'D' : Item(status=' ', wc_rev='2'), + 'D/H' : Item(status=' ', wc_rev='2'), + 'D/H/chi' : Item(status=' ', wc_rev='2'), + 'D/H/psi' : Item(status=' ', wc_rev='2'), + 'D/H/omega' : Item(status=' ', wc_rev='2'), + 'D/gamma' : Item(status=' ', wc_rev='2') + }) + + svntest.actions.run_and_verify_commit(wc_dir, + expected_output, + expected_status, + None, wc_dir) + + expected_output = svntest.wc.State(wc_dir, { + 'A/D/G' : Item(status='A '), + 'A/D/G/pi' : Item(status='A '), + 'A/D/G/tau' : Item(status='A '), + 'A/D/G/rho' : Item(status='A '), + 'D/G' : Item(status='A '), + 'D/G/pi' : Item(status='A '), + 'D/G/tau' : Item(status='A '), + 'D/G/rho' : Item(status='A ') + }) + + expected_status.tweak(wc_rev=2) + + expected_status.add({ + 'D' : Item(status=' ', wc_rev='2'), + 'D/G' : Item(status=' ', wc_rev='2'), + 'D/G/pi' : Item(status=' ', wc_rev='2'), + 'D/G/rho' : Item(status=' ', wc_rev='2'), + 'D/G/tau' : Item(status=' ', wc_rev='2'), + 'D/H' : Item(status=' ', wc_rev='2'), + 'D/H/chi' : Item(status=' ', wc_rev='2'), + 'D/H/psi' : Item(status=' ', wc_rev='2'), + 'D/H/omega' : Item(status=' ', wc_rev='2'), + 'D/gamma' : Item(status=' ', wc_rev='2'), + 'A/D/G' : Item(status=' ', wc_rev='2'), + 'A/D/G/rho' : Item(status=' ', wc_rev='2'), + 'A/D/G/tau' : Item(status=' ', wc_rev='2'), + 'A/D/G/pi' : Item(status=' ', wc_rev='2') + }) + + svntest.actions.run_and_verify_update(wc_dir, + expected_output, + None, + expected_status, + None, None, None, None, None, False, + "--set-depth=infinity", wc_dir) #---------------------------------------------------------------------- # list all tests here, starting with None: @@ -2937,6 +3020,7 @@ test_list = [ None, commit_then_immediates_update, revert_depth_files, spurious_nodes_row, + commit_excluded, ] if __name__ == "__main__": Modified: subversion/branches/reuse-ra-session/subversion/tests/cmdline/export_tests.py URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/tests/cmdline/export_tests.py?rev=1662177&r1=1662176&r2=1662177&view=diff ============================================================================== --- subversion/branches/reuse-ra-session/subversion/tests/cmdline/export_tests.py (original) +++ subversion/branches/reuse-ra-session/subversion/tests/cmdline/export_tests.py Wed Feb 25 08:15:39 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 '), })
