Modified: subversion/branches/fsx-1.10/subversion/svn/info-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/info-cmd.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/info-cmd.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/info-cmd.c Sun Jun 14 20:58:10 2015 @@ -76,6 +76,168 @@ schedule_str(svn_wc_schedule_t schedule) } } +/* Return a relative URL from information in INFO using POOL for + temporary allocation. */ +static const char* +relative_url(const svn_client_info2_t *info, apr_pool_t *pool) +{ + return apr_pstrcat(pool, "^/", + svn_path_uri_encode( + svn_uri_skip_ancestor(info->repos_root_URL, + info->URL, pool), + pool), SVN_VA_NULL); +} + + +/* The kinds of items for print_info_item(). */ +typedef enum +{ + /* Entry kind */ + info_item_kind, + + /* Repository location. */ + info_item_url, + info_item_relative_url, + info_item_repos_root_url, + info_item_repos_uuid, + + /* Working copy revision or repository HEAD revision */ + info_item_revision, + + /* Commit details. */ + info_item_last_changed_rev, + info_item_last_changed_date, + info_item_last_changed_author, + + /* Working copy information */ + info_item_wc_root +} info_item_t; + +/* Mapping between option keywords and info_item_t. */ +typedef struct info_item_map_t +{ + const svn_string_t keyword; + const info_item_t print_what; +} info_item_map_t; + +#define MAKE_STRING(x) { x, sizeof(x) - 1 } +static const info_item_map_t info_item_map[] = + { + { MAKE_STRING("kind"), info_item_kind }, + { MAKE_STRING("url"), info_item_url }, + { MAKE_STRING("relative-url"), info_item_relative_url }, + { MAKE_STRING("repos-root-url"), info_item_repos_root_url }, + { MAKE_STRING("repos-uuid"), info_item_repos_uuid }, + { MAKE_STRING("revision"), info_item_revision }, + { MAKE_STRING("last-changed-revision"), + info_item_last_changed_rev }, + { MAKE_STRING("last-changed-date"), info_item_last_changed_date }, + { MAKE_STRING("last-changed-author"), info_item_last_changed_author }, + { MAKE_STRING("wc-root"), info_item_wc_root } + }; +#undef MAKE_STRING + +static const apr_size_t info_item_map_len = + (sizeof(info_item_map) / sizeof(info_item_map[0])); + + +/* The baton type used by the info receiver functions. */ +typedef struct print_info_baton_t +{ + /* The path prefix that output paths should be normalized to. */ + const char *path_prefix; + + /* + * The following fields are used by print_info_item(). + */ + + /* Which item to print. */ + info_item_t print_what; + + /* Do we expect to show info for multiple targets? */ + svn_boolean_t multiple_targets; + + /* TRUE iff the current is a local path. */ + svn_boolean_t target_is_path; + + /* Did we already print a line of output? */ + svn_boolean_t start_new_line; +} print_info_baton_t; + + +/* Find the appropriate info_item_t for KEYWORD and initialize + * RECEIVER_BATON for print_info_item(). Use SCRATCH_POOL for + * temporary allocation. + */ +static svn_error_t * +find_print_what(const char *keyword, + print_info_baton_t *receiver_baton, + apr_pool_t *scratch_pool) +{ + svn_cl__simcheck_t **keywords = apr_palloc( + scratch_pool, info_item_map_len * sizeof(svn_cl__simcheck_t*)); + svn_cl__simcheck_t *kwbuf = apr_palloc( + scratch_pool, info_item_map_len * sizeof(svn_cl__simcheck_t)); + apr_size_t i; + + for (i = 0; i < info_item_map_len; ++i) + { + keywords[i] = &kwbuf[i]; + kwbuf[i].token.data = info_item_map[i].keyword.data; + kwbuf[i].token.len = info_item_map[i].keyword.len; + kwbuf[i].data = &info_item_map[i]; + } + + switch (svn_cl__similarity_check(keyword, keywords, + info_item_map_len, scratch_pool)) + { + const info_item_map_t *kw0; + const info_item_map_t *kw1; + const info_item_map_t *kw2; + + case 0: /* Exact match. */ + kw0 = keywords[0]->data; + receiver_baton->print_what = kw0->print_what; + return SVN_NO_ERROR; + + case 1: + /* The best alternative isn't good enough */ + return svn_error_createf( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("'%s' is not a valid value for --show-item"), + keyword); + + case 2: + /* There is only one good candidate */ + kw0 = keywords[0]->data; + return svn_error_createf( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("'%s' is not a valid value for --show-item;" + " did you mean '%s'?"), + keyword, kw0->keyword.data); + + case 3: + /* Suggest a list of the most likely candidates */ + kw0 = keywords[0]->data; + kw1 = keywords[1]->data; + return svn_error_createf( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("'%s' is not a valid value for --show-item;" + " did you mean '%s' or '%s'?"), + keyword, kw0->keyword.data, kw1->keyword.data); + + default: + /* Never suggest more than three candidates */ + kw0 = keywords[0]->data; + kw1 = keywords[1]->data; + kw2 = keywords[2]->data; + return svn_error_createf( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("'%s' is not a valid value for --show-item;" + " did you mean '%s', '%s' or '%s'?"), + keyword, kw0->keyword.data, kw1->keyword.data, kw2->keyword.data); + } +} /* A callback of type svn_client_info_receiver2_t. Prints svn info in xml mode to standard out */ @@ -87,7 +249,7 @@ print_info_xml(void *baton, { svn_stringbuf_t *sb = svn_stringbuf_create_empty(pool); const char *rev_str; - const char *path_prefix = baton; + print_info_baton_t *const receiver_baton = baton; if (SVN_IS_VALID_REVNUM(info->rev)) rev_str = apr_psprintf(pool, "%ld", info->rev); @@ -97,7 +259,7 @@ print_info_xml(void *baton, /* "<entry ...>" */ svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "entry", "path", svn_cl__local_style_skip_ancestor( - path_prefix, target, pool), + receiver_baton->path_prefix, target, pool), "kind", svn_cl__node_kind_str_xml(info->kind), "revision", rev_str, SVN_VA_NULL); @@ -109,13 +271,7 @@ print_info_xml(void *baton, { /* "<relative-url> xx </relative-url>" */ svn_cl__xml_tagged_cdata(&sb, pool, "relative-url", - apr_pstrcat(pool, "^/", - svn_path_uri_encode( - svn_uri_skip_ancestor( - info->repos_root_URL, - info->URL, pool), - pool), - SVN_VA_NULL)); + relative_url(info, pool)); } if (info->repos_root_URL || info->repos_UUID) @@ -263,11 +419,11 @@ print_info(void *baton, const svn_client_info2_t *info, apr_pool_t *pool) { - const char *path_prefix = baton; + print_info_baton_t *const receiver_baton = baton; SVN_ERR(svn_cmdline_printf(pool, _("Path: %s\n"), svn_cl__local_style_skip_ancestor( - path_prefix, target, pool))); + receiver_baton->path_prefix, target, pool))); /* ### remove this someday: it's only here for cmdline output compatibility with svn 1.1 and older. */ @@ -285,11 +441,8 @@ print_info(void *baton, SVN_ERR(svn_cmdline_printf(pool, _("URL: %s\n"), info->URL)); if (info->URL && info->repos_root_URL) - SVN_ERR(svn_cmdline_printf(pool, _("Relative URL: ^/%s\n"), - svn_path_uri_encode( - svn_uri_skip_ancestor(info->repos_root_URL, - info->URL, pool), - pool))); + SVN_ERR(svn_cmdline_printf(pool, _("Relative URL: %s\n"), + relative_url(info, pool))); if (info->repos_root_URL) SVN_ERR(svn_cmdline_printf(pool, _("Repository Root: %s\n"), @@ -389,30 +542,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( + receiver_baton->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( + receiver_baton->path_prefix, + info->wc_info->moved_to_abspath, + pool))); } if (info->last_changed_author) @@ -441,6 +582,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++) @@ -449,29 +591,39 @@ print_info(void *baton, APR_ARRAY_IDX(info->wc_info->conflicts, i, const svn_wc_conflict_description2_t *); const char *desc; + const char *base_abspath; + const char *my_abspath; + const char *their_abspath; + + base_abspath = svn_client_conflict_get_base_abspath(conflict); + my_abspath = svn_client_conflict_get_my_abspath(conflict); + their_abspath = svn_client_conflict_get_their_abspath(conflict); - switch (conflict->kind) + switch (svn_client_conflict_get_kind(conflict)) { case svn_wc_conflict_kind_text: - if (conflict->base_abspath) + if (base_abspath) SVN_ERR(svn_cmdline_printf(pool, _("Conflict Previous Base File: %s\n"), svn_cl__local_style_skip_ancestor( - path_prefix, conflict->base_abspath, + receiver_baton->path_prefix, + base_abspath, pool))); - if (conflict->my_abspath) + if (my_abspath) SVN_ERR(svn_cmdline_printf(pool, _("Conflict Previous Working File: %s\n"), svn_cl__local_style_skip_ancestor( - path_prefix, conflict->my_abspath, + receiver_baton->path_prefix, + my_abspath, pool))); - if (conflict->their_abspath) + if (their_abspath) SVN_ERR(svn_cmdline_printf(pool, _("Conflict Current Base File: %s\n"), svn_cl__local_style_skip_ancestor( - path_prefix, conflict->their_abspath, + receiver_baton->path_prefix, + their_abspath, pool))); break; @@ -479,12 +631,16 @@ 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( + receiver_baton->path_prefix, + svn_client_conflict_get_prop_reject_abspath( + conflict), + 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,13 +662,28 @@ 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, + svn_client_conflict_get_operation(conflict), + svn_client_conflict_get_node_kind(conflict), 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); + svn_cl__node_description( + svn_client_conflict_get_src_left_version(conflict), + info->repos_root_URL, pool); src_right_version = - svn_cl__node_description(conflict->src_right_version, - info->repos_root_URL, pool); + svn_cl__node_description( + svn_client_conflict_get_src_right_version(conflict), + info->repos_root_URL, pool); if (src_left_version) SVN_ERR(svn_cmdline_printf(pool, " %s: %s\n", @@ -572,6 +743,123 @@ print_info(void *baton, } +/* Helper for print_info_item(): Print the value TEXT for TARGET_PATH, + either of which may be NULL. Use POOL for temporary allocation. */ +static svn_error_t * +print_info_item_string(const char *text, const char *target_path, + apr_pool_t *pool) +{ + if (text) + { + if (target_path) + SVN_ERR(svn_cmdline_printf(pool, "%-10s %s", text, target_path)); + else + SVN_ERR(svn_cmdline_fputs(text, stdout, pool)); + } + else if (target_path) + SVN_ERR(svn_cmdline_printf(pool, "%-10s %s", "", target_path)); + + return SVN_NO_ERROR; +} + +/* Helper for print_info_item(): Print the revision number REV, which + may be SVN_INVALID_REVNUM, for TARGET_PATH, which may be NULL. Use + POOL for temporary allocation. */ +static svn_error_t * +print_info_item_revision(svn_revnum_t rev, const char *target_path, + apr_pool_t *pool) +{ + if (SVN_IS_VALID_REVNUM(rev)) + { + if (target_path) + SVN_ERR(svn_cmdline_printf(pool, "%-10ld %s", rev, target_path)); + else + SVN_ERR(svn_cmdline_printf(pool, "%-10ld", rev)); + } + else if (target_path) + SVN_ERR(svn_cmdline_printf(pool, "%-10s %s", "", target_path)); + + return SVN_NO_ERROR; +} + +/* A callback of type svn_client_info_receiver2_t. */ +static svn_error_t * +print_info_item(void *baton, + const char *target, + const svn_client_info2_t *info, + apr_pool_t *pool) +{ + print_info_baton_t *const receiver_baton = baton; + const char *const target_path = + (!receiver_baton->multiple_targets ? NULL + : (!receiver_baton->target_is_path ? info->URL + : svn_cl__local_style_skip_ancestor( + receiver_baton->path_prefix, target, pool))); + + if (receiver_baton->start_new_line) + SVN_ERR(svn_cmdline_fputs("\n", stdout, pool)); + + switch (receiver_baton->print_what) + { + case info_item_kind: + SVN_ERR(print_info_item_string(svn_node_kind_to_word(info->kind), + target_path, pool)); + break; + + case info_item_url: + SVN_ERR(print_info_item_string(info->URL, target_path, pool)); + break; + + case info_item_relative_url: + SVN_ERR(print_info_item_string(relative_url(info, pool), + target_path, pool)); + break; + + case info_item_repos_root_url: + SVN_ERR(print_info_item_string(info->repos_root_URL, target_path, pool)); + break; + + case info_item_repos_uuid: + SVN_ERR(print_info_item_string(info->repos_UUID, target_path, pool)); + break; + + case info_item_revision: + SVN_ERR(print_info_item_revision(info->rev, target_path, pool)); + break; + + case info_item_last_changed_rev: + SVN_ERR(print_info_item_revision(info->last_changed_rev, + target_path, pool)); + break; + + case info_item_last_changed_date: + SVN_ERR(print_info_item_string( + (!info->last_changed_date ? NULL + : svn_time_to_cstring(info->last_changed_date, pool)), + target_path, pool)); + break; + + case info_item_last_changed_author: + SVN_ERR(print_info_item_string(info->last_changed_author, + target_path, pool)); + break; + + case info_item_wc_root: + SVN_ERR(print_info_item_string( + (info->wc_info && info->wc_info->wcroot_abspath + ? info->wc_info->wcroot_abspath : NULL), + target_path, pool)); + break; + + default: + SVN_ERR_MALFUNCTION(); + } + + receiver_baton->start_new_line = TRUE; + return SVN_NO_ERROR; +} + + /* This implements the `svn_opt_subcommand_t' interface. */ svn_error_t * svn_cl__info(apr_getopt_t *os, @@ -587,7 +875,7 @@ svn_cl__info(apr_getopt_t *os, svn_boolean_t seen_nonexistent_target = FALSE; svn_opt_revision_t peg_revision; svn_client_info_receiver2_t receiver; - const char *path_prefix; + print_info_baton_t receiver_baton = { 0 }; SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os, opt_state->targets, @@ -600,26 +888,59 @@ svn_cl__info(apr_getopt_t *os, { receiver = print_info_xml; + if (opt_state->show_item) + return svn_error_create( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("--show-item is not valid in --xml mode")); + if (opt_state->no_newline) + return svn_error_create( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("--no-newline is not valid in --xml mode")); + /* If output is not incremental, output the XML header and wrap everything in a top-level element. This makes the output in its entirety a well-formed XML document. */ if (! opt_state->incremental) SVN_ERR(svn_cl__xml_print_header("info", pool)); } + else if (opt_state->show_item) + { + receiver = print_info_item; + + if (opt_state->incremental) + return svn_error_create( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("--incremental is only valid in --xml mode")); + + receiver_baton.multiple_targets = (opt_state->depth > svn_depth_empty + || targets->nelts > 1); + if (receiver_baton.multiple_targets && opt_state->no_newline) + return svn_error_create( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("--no-newline is only available for single-target," + " non-recursive info operations")); + + SVN_ERR(find_print_what(opt_state->show_item, &receiver_baton, pool)); + receiver_baton.start_new_line = FALSE; + } else { receiver = print_info; if (opt_state->incremental) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("'incremental' option only valid in XML " - "mode")); + return svn_error_create( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("--incremental is only valid in --xml mode")); + if (opt_state->no_newline) + return svn_error_create( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("--no-newline' is only valid with --show-item")); } if (opt_state->depth == svn_depth_unknown) opt_state->depth = svn_depth_empty; - SVN_ERR(svn_dirent_get_absolute(&path_prefix, "", pool)); + SVN_ERR(svn_dirent_get_absolute(&receiver_baton.path_prefix, "", pool)); for (i = 0; i < targets->nelts; i++) { @@ -637,10 +958,12 @@ svn_cl__info(apr_getopt_t *os, { if (peg_revision.kind == svn_opt_revision_unspecified) peg_revision.kind = svn_opt_revision_head; + receiver_baton.target_is_path = FALSE; } else { SVN_ERR(svn_dirent_get_absolute(&truepath, truepath, subpool)); + receiver_baton.target_is_path = TRUE; } err = svn_client_info4(truepath, @@ -650,7 +973,7 @@ svn_cl__info(apr_getopt_t *os, TRUE /* fetch_actual_only */, opt_state->include_externals, opt_state->changelists, - receiver, (void *) path_prefix, + receiver, &receiver_baton, ctx, subpool); if (err) @@ -677,6 +1000,9 @@ svn_cl__info(apr_getopt_t *os, if (opt_state->xml && (! opt_state->incremental)) SVN_ERR(svn_cl__xml_print_footer("info", pool)); + else if (opt_state->show_item && !opt_state->no_newline + && receiver_baton.start_new_line) + SVN_ERR(svn_cmdline_fputs("\n", stdout, pool)); if (seen_nonexistent_target) return svn_error_create(
Modified: subversion/branches/fsx-1.10/subversion/svn/list-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/list-cmd.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/list-cmd.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/list-cmd.c Sun Jun 14 20:58:10 2015 @@ -49,6 +49,12 @@ struct print_baton { svn_boolean_t in_external; }; +/* Field flags required for this function */ +static const apr_uint32_t print_dirent_fields = SVN_DIRENT_KIND; +static const apr_uint32_t print_dirent_fields_verbose = ( + SVN_DIRENT_KIND | SVN_DIRENT_SIZE | SVN_DIRENT_TIME | + SVN_DIRENT_CREATED_REV | SVN_DIRENT_LAST_AUTHOR); + /* This implements the svn_client_list_func2_t API, printing a single directory entry in text format. */ static svn_error_t * @@ -161,7 +167,10 @@ print_dirent(void *baton, } } - +/* Field flags required for this function */ +static const apr_uint32_t print_dirent_xml_fields = ( + SVN_DIRENT_KIND | SVN_DIRENT_SIZE | SVN_DIRENT_TIME | + SVN_DIRENT_CREATED_REV | SVN_DIRENT_LAST_AUTHOR); /* This implements the svn_client_list_func2_t API, printing a single dirent in XML format. */ static svn_error_t * @@ -314,10 +323,12 @@ svn_cl__list(apr_getopt_t *os, "mode")); } - if (opt_state->verbose || opt_state->xml) - dirent_fields = SVN_DIRENT_ALL; + if (opt_state->xml) + dirent_fields = print_dirent_xml_fields; + else if (opt_state->verbose) + dirent_fields = print_dirent_fields_verbose; else - dirent_fields = SVN_DIRENT_KIND; /* the only thing we actually need... */ + dirent_fields = print_dirent_fields; pb.ctx = ctx; pb.verbose = opt_state->verbose; Modified: subversion/branches/fsx-1.10/subversion/svn/mergeinfo-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/mergeinfo-cmd.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/mergeinfo-cmd.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/mergeinfo-cmd.c Sun Jun 14 20:58:10 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/fsx-1.10/subversion/svn/notify.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/notify.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/notify.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/notify.c Sun Jun 14 20:58:10 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/fsx-1.10/subversion/svn/propget-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/propget-cmd.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/propget-cmd.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/propget-cmd.c Sun Jun 14 20:58:10 2015 @@ -322,11 +322,11 @@ svn_cl__propget(apr_getopt_t *os, svn_stream_t *out; svn_boolean_t warned = FALSE; - if (opt_state->verbose && (opt_state->revprop || opt_state->strict + if (opt_state->verbose && (opt_state->revprop || opt_state->no_newline || opt_state->xml)) return svn_error_create(SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL, _("--verbose cannot be used with --revprop or " - "--strict or --xml")); + "--no-newline or --xml")); /* PNAME is first argument (and PNAME_UTF8 will be a UTF-8 version thereof) */ @@ -411,7 +411,7 @@ svn_cl__propget(apr_getopt_t *os, SVN_ERR(stream_write(out, printable_val->data, printable_val->len)); - if (! opt_state->strict) + if (! opt_state->no_newline) SVN_ERR(stream_write(out, APR_EOL_STR, strlen(APR_EOL_STR))); } } @@ -427,16 +427,16 @@ svn_cl__propget(apr_getopt_t *os, if (opt_state->depth == svn_depth_unknown) opt_state->depth = svn_depth_empty; - /* Strict mode only makes sense for a single target. So make + /* No-newline mode only makes sense for a single target. So make sure we have only a single target, and that we're not being asked to recurse on that target. */ - if (opt_state->strict + if (opt_state->no_newline && ((targets->nelts > 1) || (opt_state->depth != svn_depth_empty) || (opt_state->show_inherited_props))) return svn_error_create (SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("Strict output of property values only available for single-" - "target, non-recursive propget operations")); + _("--no-newline is only available for single-target," + " non-recursive propget operations")); for (i = 0; i < targets->nelts; i++) { @@ -472,15 +472,15 @@ svn_cl__propget(apr_getopt_t *os, /* Any time there is more than one thing to print, or where the path associated with a printed thing is not obvious, we'll print filenames. That is, unless we've been told - not to do so with the --strict option. */ + not to do so with the --no-newline option. */ print_filenames = ((opt_state->depth > svn_depth_empty || targets->nelts > 1 || apr_hash_count(props) > 1 || opt_state->verbose || opt_state->show_inherited_props) - && (! opt_state->strict)); - omit_newline = opt_state->strict; - like_proplist = opt_state->verbose && !opt_state->strict; + && (! opt_state->no_newline)); + omit_newline = opt_state->no_newline; + like_proplist = opt_state->verbose && !opt_state->no_newline; /* If there are no properties, and exactly one node was queried, then warn. */ @@ -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/fsx-1.10/subversion/svn/props.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/props.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/props.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/props.c Sun Jun 14 20:58:10 2015 @@ -112,59 +112,6 @@ svn_cl__check_boolean_prop_val(const cha } } - -/* Context for sorting property names */ -struct simprop_context_t -{ - svn_string_t name; /* The name of the property we're comparing with */ - svn_membuf_t buffer; /* Buffer for similarity testing */ -}; - -struct simprop_t -{ - const char *propname; /* The original svn: property name */ - svn_string_t name; /* The property name without the svn: prefix */ - unsigned int score; /* The similarity score */ - apr_size_t diff; /* Number of chars different from context.name */ - struct simprop_context_t *context; /* Sorting context for qsort() */ -}; - -/* Similarity test between two property names */ -static APR_INLINE unsigned int -simprop_key_diff(const svn_string_t *key, const svn_string_t *ctx, - svn_membuf_t *buffer, apr_size_t *diff) -{ - apr_size_t lcs; - const unsigned int score = svn_string__similarity(key, ctx, buffer, &lcs); - if (key->len > ctx->len) - *diff = key->len - lcs; - else - *diff = ctx->len - lcs; - return score; -} - -/* Key comparator for qsort for simprop_t */ -static int -simprop_compare(const void *pkeya, const void *pkeyb) -{ - struct simprop_t *const keya = *(struct simprop_t *const *)pkeya; - struct simprop_t *const keyb = *(struct simprop_t *const *)pkeyb; - struct simprop_context_t *const context = keya->context; - - if (keya->score == -1) - keya->score = simprop_key_diff(&keya->name, &context->name, - &context->buffer, &keya->diff); - if (keyb->score == -1) - keyb->score = simprop_key_diff(&keyb->name, &context->name, - &context->buffer, &keyb->diff); - - return (keya->score < keyb->score ? 1 - : (keya->score > keyb->score ? -1 - : (keya->diff > keyb->diff ? 1 - : (keya->diff < keyb->diff ? -1 : 0)))); -} - - static const char* force_prop_option_message(svn_cl__prop_use_t prop_use, const char *prop_name, apr_pool_t *scratch_pool) @@ -174,18 +121,18 @@ force_prop_option_message(svn_cl__prop_u case svn_cl__prop_use_set: return apr_psprintf( scratch_pool, - _("(To set the '%s' property, re-run with '--force'.)"), + _("Use '--force' to set the '%s' property."), prop_name); case svn_cl__prop_use_edit: return apr_psprintf( scratch_pool, - _("(To edit the '%s' property, re-run with '--force'.)"), + _("Use '--force' to edit the '%s' property."), prop_name); case svn_cl__prop_use_use: default: return apr_psprintf( scratch_pool, - _("(To use the '%s' property, re-run with '--force'.)"), + _("Use '--force' to use the '%s' property'."), prop_name); } } @@ -199,21 +146,18 @@ wrong_prop_error_message(svn_cl__prop_us case svn_cl__prop_use_set: return apr_psprintf( scratch_pool, - _("'%s' is not a valid %s property name;" - " re-run with '--force' to set it"), + _("'%s' is not a valid %s property name; use '--force' to set it"), prop_name, SVN_PROP_PREFIX); case svn_cl__prop_use_edit: return apr_psprintf( scratch_pool, - _("'%s' is not a valid %s property name;" - " re-run with '--force' to edit it"), + _("'%s' is not a valid %s property name; use '--force' to edit it"), prop_name, SVN_PROP_PREFIX); case svn_cl__prop_use_use: default: return apr_psprintf( scratch_pool, - _("'%s' is not a valid %s property name;" - " re-run with '--force' to use it"), + _("'%s' is not a valid %s property name; use '--force' to use it"), prop_name, SVN_PROP_PREFIX); } } @@ -239,33 +183,34 @@ svn_cl__check_svn_prop_name(const char * const char *const *const proplist = (revprop ? revprops : nodeprops); const apr_size_t numprops = (revprop ? revprops_len : nodeprops_len); - struct simprop_t **propkeys; - struct simprop_t *propbuf; + svn_cl__simcheck_t **propkeys; + svn_cl__simcheck_t *propbuf; apr_size_t i; - struct simprop_context_t context; + svn_string_t propstring; svn_string_t prefix; + svn_membuf_t buffer; - context.name.data = propname; - context.name.len = strlen(propname); + propstring.data = propname; + propstring.len = strlen(propname); prefix.data = SVN_PROP_PREFIX; prefix.len = strlen(SVN_PROP_PREFIX); - svn_membuf__create(&context.buffer, 0, scratch_pool); + svn_membuf__create(&buffer, 0, scratch_pool); /* First, check if the name is even close to being in the svn: namespace. It must contain a colon in the right place, and we only allow one-char typos or a single transposition. */ - if (context.name.len < prefix.len - || context.name.data[prefix.len - 1] != prefix.data[prefix.len - 1]) + if (propstring.len < prefix.len + || propstring.data[prefix.len - 1] != prefix.data[prefix.len - 1]) return SVN_NO_ERROR; /* Wrong prefix, ignore */ else { apr_size_t lcs; - const apr_size_t name_len = context.name.len; - context.name.len = prefix.len; /* Only check up to the prefix length */ - svn_string__similarity(&context.name, &prefix, &context.buffer, &lcs); - context.name.len = name_len; /* Restore the original propname length */ + const apr_size_t name_len = propstring.len; + propstring.len = prefix.len; /* Only check up to the prefix length */ + svn_string__similarity(&propstring, &prefix, &buffer, &lcs); + propstring.len = name_len; /* Restore the original propname length */ if (lcs < prefix.len - 1) return SVN_NO_ERROR; /* Wrong prefix, ignore */ @@ -276,11 +221,11 @@ svn_cl__check_svn_prop_name(const char * for (i = 0; i < numprops; ++i) { if (0 == strcmp(proplist[i] + prefix.len, propname + prefix.len)) - return svn_error_createf( + return svn_error_quick_wrap(svn_error_createf( SVN_ERR_CLIENT_PROPERTY_NAME, NULL, _("'%s' is not a valid %s property name;" - " did you mean '%s'?\n%s"), - propname, SVN_PROP_PREFIX, proplist[i], + " did you mean '%s'?"), + propname, SVN_PROP_PREFIX, proplist[i]), force_prop_option_message(prop_use, propname, scratch_pool)); } return SVN_NO_ERROR; @@ -292,65 +237,59 @@ svn_cl__check_svn_prop_name(const char * we already know that it's the same and looking at it would only skew the results. */ propkeys = apr_palloc(scratch_pool, - numprops * sizeof(struct simprop_t*)); + numprops * sizeof(svn_cl__simcheck_t*)); propbuf = apr_palloc(scratch_pool, - numprops * sizeof(struct simprop_t)); - context.name.data += prefix.len; - context.name.len -= prefix.len; + numprops * sizeof(svn_cl__simcheck_t)); + propstring.data += prefix.len; + propstring.len -= prefix.len; for (i = 0; i < numprops; ++i) { propkeys[i] = &propbuf[i]; - propbuf[i].propname = proplist[i]; - propbuf[i].name.data = proplist[i] + prefix.len; - propbuf[i].name.len = strlen(propbuf[i].name.data); - propbuf[i].score = (unsigned int)-1; - propbuf[i].context = &context; + propbuf[i].token.data = proplist[i] + prefix.len; + propbuf[i].token.len = strlen(propbuf[i].token.data); + propbuf[i].data = proplist[i]; } - qsort(propkeys, numprops, sizeof(*propkeys), simprop_compare); - - if (0 == propkeys[0]->diff) - return SVN_NO_ERROR; /* We found an exact match. */ - - /* See if we can suggest a sane alternative spelling */ - for (i = 0; i < numprops; ++i) - if (propkeys[i]->score < 666) /* 2/3 similarity required */ - break; - - switch (i) + switch (svn_cl__similarity_check( + propstring.data, propkeys, numprops, scratch_pool)) { case 0: + return SVN_NO_ERROR; /* We found an exact match. */ + + case 1: /* The best alternative isn't good enough */ return svn_error_create( SVN_ERR_CLIENT_PROPERTY_NAME, NULL, wrong_prop_error_message(prop_use, propname, scratch_pool)); - case 1: + case 2: /* There is only one good candidate */ - return svn_error_createf( + return svn_error_quick_wrap(svn_error_createf( SVN_ERR_CLIENT_PROPERTY_NAME, NULL, - _("'%s' is not a valid %s property name; did you mean '%s'?\n%s"), - propname, SVN_PROP_PREFIX, propkeys[0]->propname, + _("'%s' is not a valid %s property name; did you mean '%s'?"), + propname, SVN_PROP_PREFIX, + (const char *)propkeys[0]->data), force_prop_option_message(prop_use, propname, scratch_pool)); - case 2: + case 3: /* Suggest a list of the most likely candidates */ - return svn_error_createf( + return svn_error_quick_wrap(svn_error_createf( SVN_ERR_CLIENT_PROPERTY_NAME, NULL, - _("'%s' is not a valid %s property name\n" - "Did you mean '%s' or '%s'?\n%s"), + _("'%s' is not a valid %s property name; " + "did you mean '%s' or '%s'?"), propname, SVN_PROP_PREFIX, - propkeys[0]->propname, propkeys[1]->propname, + (const char *)propkeys[0]->data, (const char *)propkeys[1]->data), force_prop_option_message(prop_use, propname, scratch_pool)); default: /* Never suggest more than three candidates */ - return svn_error_createf( + return svn_error_quick_wrap(svn_error_createf( SVN_ERR_CLIENT_PROPERTY_NAME, NULL, - _("'%s' is not a valid %s property name\n" - "Did you mean '%s', '%s' or '%s'?\n%s"), + _("'%s' is not a valid %s property name; " + "did you mean '%s', '%s' or '%s'?"), propname, SVN_PROP_PREFIX, - propkeys[0]->propname, propkeys[1]->propname, propkeys[2]->propname, + (const char *)propkeys[0]->data, + (const char *)propkeys[1]->data, (const char *)propkeys[2]->data), force_prop_option_message(prop_use, propname, scratch_pool)); } } Modified: subversion/branches/fsx-1.10/subversion/svn/status-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/status-cmd.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/status-cmd.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/status-cmd.c Sun Jun 14 20:58:10 2015 @@ -288,8 +288,15 @@ svn_cl__status(apr_getopt_t *os, SVN_ERR(svn_cl__check_targets_are_local_paths(targets)); - /* We want our -u statuses to be against HEAD. */ - rev.kind = svn_opt_revision_head; + /* We want our -u statuses to be against HEAD by default. */ + if (opt_state->start_revision.kind == svn_opt_revision_unspecified) + rev.kind = svn_opt_revision_head; + else if (! opt_state->update) + return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("--revision (-r) option valid only with " + "--show-updates (-u) option")); + else + rev = opt_state->start_revision; sb.had_print_error = FALSE; Modified: subversion/branches/fsx-1.10/subversion/svn/status.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/status.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/status.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/status.c Sun Jun 14 20:58:10 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/fsx-1.10/subversion/svn/svn.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/svn.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/svn.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/svn.c Sun Jun 14 20:58:10 2015 @@ -110,7 +110,7 @@ typedef enum svn_cl__longopt_t { opt_remove, opt_revprop, opt_stop_on_copy, - opt_strict, + opt_strict, /* ### DEPRECATED */ opt_targets, opt_depth, opt_set_depth, @@ -125,11 +125,7 @@ typedef enum svn_cl__longopt_t { opt_show_revs, opt_reintegrate, opt_trust_server_cert, - opt_trust_server_cert_unknown_ca, - opt_trust_server_cert_cn_mismatch, - opt_trust_server_cert_expired, - opt_trust_server_cert_not_yet_valid, - opt_trust_server_cert_other_failure, + opt_trust_server_cert_failures, opt_strip, opt_ignore_keywords, opt_reverse_diff, @@ -144,7 +140,9 @@ typedef enum svn_cl__longopt_t { opt_remove_unversioned, opt_remove_ignored, opt_no_newline, - opt_show_passwords + opt_show_passwords, + opt_pin_externals, + opt_show_item, } svn_cl__longopt_t; @@ -231,7 +229,7 @@ const apr_getopt_option_t svn_cl__option " " "'empty', 'files', 'immediates', or 'infinity')")}, {"xml", opt_xml, 0, N_("output in XML")}, - {"strict", opt_strict, 0, N_("use strict semantics")}, + {"strict", opt_strict, 0, N_("DEPRECATED")}, {"stop-on-copy", opt_stop_on_copy, 0, N_("do not cross copies while traversing history")}, {"no-ignore", opt_no_ignore, 0, @@ -241,29 +239,23 @@ const apr_getopt_option_t svn_cl__option {"no-auth-cache", opt_no_auth_cache, 0, N_("do not cache authentication tokens")}, {"trust-server-cert", opt_trust_server_cert, 0, - N_("deprecated; same as --trust-unknown-ca")}, - {"trust-unknown-ca", opt_trust_server_cert_unknown_ca, 0, - N_("with --non-interactive, accept SSL server\n" + N_("deprecated; same as\n" " " - "certificates from unknown certificate authorities")}, - {"trust-cn-mismatch", opt_trust_server_cert_cn_mismatch, 0, + "--trust-server-cert-failures=unknown-ca")}, + {"trust-server-cert-failures", opt_trust_server_cert_failures, 1, N_("with --non-interactive, accept SSL server\n" " " - "certificates even if the server hostname does not\n" + "certificates with failures; ARG is comma-separated\n" " " - "match the certificate's common name attribute")}, - {"trust-expired", opt_trust_server_cert_expired, 0, - N_("with --non-interactive, accept expired SSL server\n" + "list of 'unknown-ca' (Unknown Authority),\n" " " - "certificates")}, - {"trust-not-yet-valid", opt_trust_server_cert_not_yet_valid, 0, - N_("with --non-interactive, accept SSL server\n" + "'cn-mismatch' (Hostname mismatch), 'expired'\n" " " - "certificates from the future")}, - {"trust-other-failure", opt_trust_server_cert_other_failure, 0, - N_("with --non-interactive, accept SSL server\n" + "(Expired certificate), 'not-yet-valid' (Not yet\n" + " " + "valid certificate) and 'other' (all other not\n" " " - "certificates with failures other than the above")}, + "separately classified certificate errors).")}, {"non-interactive", opt_non_interactive, 0, N_("do no interactive prompting (default is to prompt\n" " " @@ -406,7 +398,7 @@ const apr_getopt_option_t svn_cl__option " " "svn:externals properties")}, {"show-inherited-props", opt_show_inherited_props, 0, - N_("retrieve target's inherited properties")}, + N_("retrieve properties set on parents of the target")}, {"search", opt_search, 1, N_("use ARG as search pattern (glob syntax)")}, {"search-and", opt_search_and, 1, @@ -418,6 +410,12 @@ 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)")}, + {"show-item", opt_show_item, 1, + N_("print only the item identified by ARG")}, /* Long-opt Aliases * @@ -451,9 +449,7 @@ const apr_getopt_option_t svn_cl__option const int svn_cl__global_options[] = { opt_auth_username, opt_auth_password, opt_no_auth_cache, opt_non_interactive, opt_force_interactive, opt_trust_server_cert, - opt_trust_server_cert_unknown_ca, opt_trust_server_cert_cn_mismatch, - opt_trust_server_cert_expired, opt_trust_server_cert_not_yet_valid, - opt_trust_server_cert_other_failure, + opt_trust_server_cert_failures, opt_config_dir, opt_config_options, 0 }; @@ -498,16 +494,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 +619,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" @@ -715,9 +727,24 @@ const svn_opt_subcommand_desc2_t svn_cl_ "\n" " Print information about each TARGET (default: '.').\n" " TARGET may be either a working-copy path or URL. If specified, REV\n" - " determines in which revision the target is first looked up.\n"), + " determines in which revision the target is first looked up.\n" + "\n" + " With --show-item, print only the value of one item of information\n" + " about TARGET. One of the following items can be selected:\n" + " kind the kind of TARGET\n" + " url the URL of TARGET in the repository\n" + " relative-url the repository-relative URL\n" + " repos-root-url the repository root URL\n" + " repos-uuid the repository UUID\n" + " revision the revision of TARGET (defaults to BASE\n" + " for working copy paths and HEAD for URLs)\n" + " last-changed-revision the most recent revision in which TARGET\n" + " was changed\n" + " last-changed-date the date of the last-changed revision\n" + " last-changed-author the author of the last-changed revision\n" + " wc-root the root of TARGET's working copy"), {'r', 'R', opt_depth, opt_targets, opt_incremental, opt_xml, - opt_changelist, opt_include_externals} + opt_changelist, opt_include_externals, opt_show_item, opt_no_newline} }, { "list", svn_cl__list, {"ls"}, N_ @@ -1334,14 +1361,14 @@ const svn_opt_subcommand_desc2_t svn_cl_ "\n" " By default, an extra newline is printed after the property value so that\n" " the output looks pretty. With a single TARGET, depth 'empty' and without\n" - " --show-inherited-props, you can use the --strict option to disable this\n" + " --show-inherited-props, you can use the --no-newline option to disable this\n" " (useful when redirecting a binary property value to a file, for example).\n" "\n" " See 'svn help propset' for descriptions of the svn:* special properties.\n"), - {'v', 'R', opt_depth, 'r', opt_revprop, opt_strict, opt_xml, + {'v', 'R', opt_depth, 'r', opt_revprop, opt_strict, opt_no_newline, opt_xml, opt_changelist, opt_show_inherited_props }, {{'v', N_("print path, name and value on separate lines")}, - {opt_strict, N_("don't print an extra newline")}} }, + {opt_strict, N_("(deprecated; use --no-newline)")}} }, { "proplist", svn_cl__proplist, {"plist", "pl"}, N_ ("List all properties on files, dirs, or revisions.\n" @@ -1418,6 +1445,13 @@ const svn_opt_subcommand_desc2_t svn_cl_ " directory:\n" " svn:ignore - A list of file glob patterns to ignore, one per line.\n" " svn:global-ignores - Like svn:ignore, but inheritable.\n" + " svn:auto-props - Automatically set properties on files when they are\n" + " added or imported. Contains key-value pairs, one per line, in the format:\n" + " PATTERN = PROPNAME=VALUE[;PROPNAME=VALUE ...]\n" + " Example (where a literal ';' is escaped by adding another ';'):\n" + " *.html = svn:eol-style=native;svn:mime-type=text/html;; charset=UTF8\n" + " Applies recursively to all files added or imported under the directory\n" + " it is set on. See also [auto-props] in the client configuration file.\n" " svn:externals - A list of module specifiers, one per line, in the\n" " following format similar to the syntax of 'svn checkout':\n" " [-r REV] URL[@PEG] LOCALPATH\n" @@ -1599,8 +1633,8 @@ const svn_opt_subcommand_desc2_t svn_cl_ " ! C wc/qaz.c\n" " > local missing, incoming edit upon update\n" " D wc/qax.c\n"), - { 'u', 'v', 'N', opt_depth, 'q', opt_no_ignore, opt_incremental, opt_xml, - opt_ignore_externals, opt_changelist}, + { 'u', 'v', 'N', opt_depth, 'r', 'q', opt_no_ignore, opt_incremental, + opt_xml, opt_ignore_externals, opt_changelist}, {{'q', N_("don't print unversioned items")}} }, { "switch", svn_cl__switch, {"sw"}, N_ @@ -1717,14 +1751,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} } }; @@ -2141,9 +2167,6 @@ sub_main(int *exit_code, int argc, const case opt_stop_on_copy: opt_state.stop_on_copy = TRUE; break; - case opt_strict: - opt_state.strict = TRUE; - break; case opt_no_ignore: opt_state.no_ignore = TRUE; break; @@ -2157,20 +2180,17 @@ sub_main(int *exit_code, int argc, const force_interactive = TRUE; break; case opt_trust_server_cert: /* backwards compat to 1.8 */ - case opt_trust_server_cert_unknown_ca: opt_state.trust_server_cert_unknown_ca = TRUE; break; - case opt_trust_server_cert_cn_mismatch: - opt_state.trust_server_cert_cn_mismatch = TRUE; - break; - case opt_trust_server_cert_expired: - opt_state.trust_server_cert_expired = TRUE; - break; - case opt_trust_server_cert_not_yet_valid: - opt_state.trust_server_cert_not_yet_valid = TRUE; - break; - case opt_trust_server_cert_other_failure: - opt_state.trust_server_cert_other_failure = TRUE; + case opt_trust_server_cert_failures: + SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); + SVN_ERR(svn_cmdline__parse_trust_options( + &opt_state.trust_server_cert_unknown_ca, + &opt_state.trust_server_cert_cn_mismatch, + &opt_state.trust_server_cert_expired, + &opt_state.trust_server_cert_not_yet_valid, + &opt_state.trust_server_cert_other_failure, + utf8_opt_arg, pool)); break; case opt_no_diff_added: opt_state.diff.no_diff_added = TRUE; @@ -2237,7 +2257,7 @@ sub_main(int *exit_code, int argc, const SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); SVN_ERR(svn_cmdline__parse_config_option(opt_state.config_options, - utf8_opt_arg, pool)); + utf8_opt_arg, "svn: ", pool)); break; case opt_autoprops: opt_state.autoprops = TRUE; @@ -2385,11 +2405,19 @@ sub_main(int *exit_code, int argc, const opt_state.remove_ignored = TRUE; break; case opt_no_newline: + case opt_strict: /* ### DEPRECATED */ opt_state.no_newline = TRUE; break; case opt_show_passwords: opt_state.show_passwords = TRUE; break; + case opt_pin_externals: + opt_state.pin_externals = TRUE; + break; + case opt_show_item: + SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); + opt_state.show_item = utf8_opt_arg; + break; default: /* Hmmm. Perhaps this would be a good place to squirrel away opts that commands like svn diff might need. Hmmm indeed. */ @@ -2599,25 +2627,13 @@ sub_main(int *exit_code, int argc, const /* --trust-* options can only be used with --non-interactive */ if (!opt_state.non_interactive) { - if (opt_state.trust_server_cert_unknown_ca) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-unknown-ca requires " - "--non-interactive")); - if (opt_state.trust_server_cert_cn_mismatch) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-cn-mismatch requires " - "--non-interactive")); - if (opt_state.trust_server_cert_expired) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-expired requires " - "--non-interactive")); - if (opt_state.trust_server_cert_not_yet_valid) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-not-yet-valid requires " - "--non-interactive")); - if (opt_state.trust_server_cert_other_failure) + if (opt_state.trust_server_cert_unknown_ca + || opt_state.trust_server_cert_cn_mismatch + || opt_state.trust_server_cert_expired + || opt_state.trust_server_cert_not_yet_valid + || opt_state.trust_server_cert_other_failure) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-other-failure requires " + _("--trust-server-cert-failures requires " "--non-interactive")); } @@ -3022,10 +3038,9 @@ sub_main(int *exit_code, int argc, const if (err->apr_err == SVN_ERR_CL_INSUFFICIENT_ARGS || err->apr_err == SVN_ERR_CL_ARG_PARSING_ERROR) { - err = svn_error_quick_wrap( - err, apr_psprintf(pool, - _("Try 'svn help %s' for more information"), - subcommand->name)); + err = svn_error_quick_wrapf( + err, _("Try 'svn help %s' for more information"), + subcommand->name); } if (err->apr_err == SVN_ERR_WC_UPGRADE_REQUIRED) { Modified: subversion/branches/fsx-1.10/subversion/svn/util.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svn/util.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svn/util.c (original) +++ subversion/branches/fsx-1.10/subversion/svn/util.c Sun Jun 14 20:58:10 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/fsx-1.10/subversion/svnadmin/svnadmin.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svnadmin/svnadmin.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svnadmin/svnadmin.c (original) +++ subversion/branches/fsx-1.10/subversion/svnadmin/svnadmin.c Sun Jun 14 20:58:10 2015 @@ -868,6 +868,14 @@ struct repos_notify_handler_baton { /* Stream to write progress and other non-error output to. */ svn_stream_t *feedback_stream; + /* Suppress notifications that are neither errors nor warnings. */ + svn_boolean_t silent_running; + + /* Whether errors contained in notifications should be printed along + with the notification. If FALSE, any errors will only be + summarized. */ + svn_boolean_t silent_errors; + /* List of errors encountered during 'svnadmin verify --keep-going'. */ apr_array_header_t *error_summary; @@ -886,6 +894,14 @@ repos_notify_handler(void *baton, struct repos_notify_handler_baton *b = baton; svn_stream_t *feedback_stream = b->feedback_stream; + /* Don't print anything if the feedback stream isn't provided. + Only print errors and warnings in silent mode. */ + if (!feedback_stream + || (b->silent_running + && notify->action != svn_repos_notify_warning + && notify->action != svn_repos_notify_failure)) + return; + switch (notify->action) { case svn_repos_notify_warning: @@ -901,12 +917,14 @@ repos_notify_handler(void *baton, notify->revision)); if (notify->err) { - svn_handle_error2(notify->err, stderr, FALSE /* non-fatal */, - "svnadmin: "); + if (!b->silent_errors) + svn_handle_error2(notify->err, stderr, FALSE /* non-fatal */, + "svnadmin: "); + 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); @@ -1787,6 +1805,8 @@ subcommand_verify(apr_getopt_t *os, void svn_fs_t *fs; svn_revnum_t youngest, lower, upper; struct repos_notify_handler_baton notify_baton = { 0 }; + struct repos_notify_handler_baton *notify_baton_p = ¬ify_baton; + svn_repos_notify_func_t notify_func = repos_notify_handler; svn_error_t *verify_err; /* Expect no more arguments. */ @@ -1831,26 +1851,42 @@ subcommand_verify(apr_getopt_t *os, void upper = lower; } - if (! opt_state->quiet) - notify_baton.feedback_stream = recode_stream_create(stdout, pool); + /* Set up the notification handler. */ + if (!opt_state->quiet || opt_state->keep_going) + { + if (opt_state->quiet) + { + notify_baton.silent_running = TRUE; + notify_baton.feedback_stream = recode_stream_create(stderr, pool); + } + else + notify_baton.feedback_stream = recode_stream_create(stdout, pool); - if (opt_state->keep_going) - notify_baton.error_summary = - apr_array_make(pool, 0, sizeof(struct verification_error *)); + if (opt_state->keep_going) + notify_baton.error_summary = + apr_array_make(pool, 0, sizeof(struct verification_error *)); + else + notify_baton.silent_errors = TRUE; - notify_baton.result_pool = pool; + notify_baton.result_pool = pool; + } + else + { + notify_func = NULL; + notify_baton_p = NULL; + } verify_err = svn_repos_verify_fs3(repos, lower, upper, opt_state->keep_going, opt_state->check_normalization, opt_state->metadata_only, - !opt_state->quiet - ? repos_notify_handler : NULL, - ¬ify_baton, check_cancel, - NULL, pool); + notify_func, notify_baton_p, + check_cancel, NULL, pool); /* Show the --keep-going error summary. */ - if (opt_state->keep_going && notify_baton.error_summary->nelts > 0) + if (!opt_state->quiet + && opt_state->keep_going + && notify_baton.error_summary->nelts > 0) { int rev_maxlength; svn_revnum_t end_revnum; @@ -1880,7 +1916,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 +1928,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, @@ -2510,6 +2546,7 @@ sub_main(int *exit_code, int argc, const SVN_ERR(svn_stringbuf_from_file2(&(opt_state.filedata), utf8_opt_arg, pool)); dash_F_arg = TRUE; + break; case svnadmin__version: opt_state.version = TRUE; break; Modified: subversion/branches/fsx-1.10/subversion/svnbench/cl.h URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svnbench/cl.h?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svnbench/cl.h (original) +++ subversion/branches/fsx-1.10/subversion/svnbench/cl.h Sun Jun 14 20:58:10 2015 @@ -80,7 +80,6 @@ typedef struct svn_cl__opt_state_t svn_boolean_t help; /* print usage message */ const char *auth_username; /* auth username */ /* UTF-8! */ const char *auth_password; /* auth password */ /* UTF-8! */ - const char *extensions; /* subprocess extension args */ /* UTF-8! */ apr_array_header_t *targets; /* target list from file */ /* UTF-8! */ svn_boolean_t no_auth_cache; /* do not cache authentication information */ svn_boolean_t stop_on_copy; /* don't cross copies during processing */ @@ -109,6 +108,7 @@ typedef struct svn_cl__cmd_baton_t /* Declare all the command procedures */ svn_opt_subcommand_t svn_cl__help, + svn_cl__null_blame, svn_cl__null_export, svn_cl__null_list, svn_cl__null_log, Modified: subversion/branches/fsx-1.10/subversion/svnbench/svnbench.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/svnbench/svnbench.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/svnbench/svnbench.c (original) +++ subversion/branches/fsx-1.10/subversion/svnbench/svnbench.c Sun Jun 14 20:58:10 2015 @@ -67,11 +67,7 @@ typedef enum svn_cl__longopt_t { opt_with_all_revprops, opt_with_no_revprops, opt_trust_server_cert, - opt_trust_server_cert_unknown_ca, - opt_trust_server_cert_cn_mismatch, - opt_trust_server_cert_expired, - opt_trust_server_cert_not_yet_valid, - opt_trust_server_cert_other_failure, + opt_trust_server_cert_failures, opt_changelist } svn_cl__longopt_t; @@ -127,29 +123,23 @@ const apr_getopt_option_t svn_cl__option {"no-auth-cache", opt_no_auth_cache, 0, N_("do not cache authentication tokens")}, {"trust-server-cert", opt_trust_server_cert, 0, - N_("deprecated; same as --trust-unknown-ca")}, - {"trust-unknown-ca", opt_trust_server_cert_unknown_ca, 0, - N_("with --non-interactive, accept SSL server\n" + N_("deprecated; same as\n" " " - "certificates from unknown certificate authorities")}, - {"trust-cn-mismatch", opt_trust_server_cert_cn_mismatch, 0, + "--trust-server-cert-failures=unknown-ca")}, + {"trust-server-cert-failures", opt_trust_server_cert_failures, 1, N_("with --non-interactive, accept SSL server\n" " " - "certificates even if the server hostname does not\n" + "certificates with failures; ARG is comma-separated\n" " " - "match the certificate's common name attribute")}, - {"trust-expired", opt_trust_server_cert_expired, 0, - N_("with --non-interactive, accept expired SSL server\n" + "list of 'unknown-ca' (Unknown Authority),\n" " " - "certificates")}, - {"trust-not-yet-valid", opt_trust_server_cert_not_yet_valid, 0, - N_("with --non-interactive, accept SSL server\n" + "'cn-mismatch' (Hostname mismatch), 'expired'\n" " " - "certificates from the future")}, - {"trust-other-failure", opt_trust_server_cert_other_failure, 0, - N_("with --non-interactive, accept SSL server\n" + "(Expired certificate), 'not-yet-valid' (Not yet\n" " " - "certificates with failures other than the above")}, + "valid certificate) and 'other' (all other not\n" + " " + "separately classified certificate errors).")}, {"non-interactive", opt_non_interactive, 0, N_("do no interactive prompting")}, {"config-dir", opt_config_dir, 1, @@ -205,9 +195,7 @@ const apr_getopt_option_t svn_cl__option willy-nilly to every invocation of 'svn') . */ const int svn_cl__global_options[] = { opt_auth_username, opt_auth_password, opt_no_auth_cache, opt_non_interactive, - opt_trust_server_cert, opt_trust_server_cert_unknown_ca, - opt_trust_server_cert_cn_mismatch, opt_trust_server_cert_expired, - opt_trust_server_cert_not_yet_valid, opt_trust_server_cert_other_failure, + opt_trust_server_cert, opt_trust_server_cert_failures, opt_config_dir, opt_config_options, 0 }; @@ -219,6 +207,26 @@ const svn_opt_subcommand_desc2_t svn_cl_ {0} }, /* This command is also invoked if we see option "--help", "-h" or "-?". */ + { "null-blame", svn_cl__null_blame, {0}, N_ + ("Fetch all versions of a file in a batch.\n" + "usage: null-blame [-rM:N] TARGET[@REV]...\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" + "\n" + " Write the annotated result to standard output.\n"), + {'r', 'g'} }, + { "null-export", svn_cl__null_export, {0}, N_ ("Create an unversioned copy of a tree.\n" "usage: null-export [-r REV] URL[@PEGREV]\n" @@ -281,8 +289,7 @@ const svn_opt_subcommand_desc2_t svn_cl_ " follow copy history by default. Use --stop-on-copy to disable this\n" " behavior, which can be useful for determining branchpoints.\n"), {'r', 'q', 'v', 'g', 'c', opt_targets, opt_stop_on_copy, - 'l', opt_with_all_revprops, opt_with_no_revprops, opt_with_revprop, - 'x',}, + 'l', opt_with_all_revprops, opt_with_no_revprops, opt_with_revprop,}, {{opt_with_revprop, N_("retrieve revision property ARG")}, {'c', N_("the change made in revision ARG")}} }, @@ -527,10 +534,10 @@ sub_main(int *exit_code, int argc, const opt_arg, pool) != 0) { SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); - return svn_error_createf - (SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("Syntax error in revision argument '%s'"), - utf8_opt_arg); + return svn_error_createf( + SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("Syntax error in revision argument '%s'"), + utf8_opt_arg); } break; case 'v': @@ -605,24 +612,17 @@ sub_main(int *exit_code, int argc, const opt_state.non_interactive = TRUE; break; case opt_trust_server_cert: /* backwards compat to 1.8 */ - case opt_trust_server_cert_unknown_ca: opt_state.trust_server_cert_unknown_ca = TRUE; break; - case opt_trust_server_cert_cn_mismatch: - opt_state.trust_server_cert_cn_mismatch = TRUE; - break; - case opt_trust_server_cert_expired: - opt_state.trust_server_cert_expired = TRUE; - break; - case opt_trust_server_cert_not_yet_valid: - opt_state.trust_server_cert_not_yet_valid = TRUE; - break; - case opt_trust_server_cert_other_failure: - opt_state.trust_server_cert_other_failure = TRUE; - break; - case 'x': - SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.extensions, - opt_arg, pool)); + case opt_trust_server_cert_failures: + SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); + SVN_ERR(svn_cmdline__parse_trust_options( + &opt_state.trust_server_cert_unknown_ca, + &opt_state.trust_server_cert_cn_mismatch, + &opt_state.trust_server_cert_expired, + &opt_state.trust_server_cert_not_yet_valid, + &opt_state.trust_server_cert_other_failure, + utf8_opt_arg, pool)); break; case opt_config_dir: { @@ -639,7 +639,7 @@ sub_main(int *exit_code, int argc, const SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool)); SVN_ERR(svn_cmdline__parse_config_option(opt_state.config_options, - opt_arg, pool)); + opt_arg, "svnbench: ", pool)); break; case opt_with_all_revprops: /* If --with-all-revprops is specified along with one or more @@ -755,9 +755,9 @@ sub_main(int *exit_code, int argc, const if (subcommand->name[0] == '-') SVN_ERR(svn_cl__help(NULL, NULL, pool)); else - svn_error_clear - (svn_cmdline_fprintf - (stderr, pool, _("Subcommand '%s' doesn't accept option '%s'\n" + svn_error_clear( + svn_cmdline_fprintf( + stderr, pool, _("Subcommand '%s' doesn't accept option '%s'\n" "Type 'svnbench help %s' for usage.\n"), subcommand->name, optstr, subcommand->name)); *exit_code = EXIT_FAILURE; @@ -798,25 +798,13 @@ sub_main(int *exit_code, int argc, const /* --trust-* options can only be used with --non-interactive */ if (!opt_state.non_interactive) { - if (opt_state.trust_server_cert_unknown_ca) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-unknown-ca requires " - "--non-interactive")); - if (opt_state.trust_server_cert_cn_mismatch) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-cn-mismatch requires " - "--non-interactive")); - if (opt_state.trust_server_cert_expired) + if (opt_state.trust_server_cert_unknown_ca + || opt_state.trust_server_cert_cn_mismatch + || opt_state.trust_server_cert_expired + || opt_state.trust_server_cert_not_yet_valid + || opt_state.trust_server_cert_other_failure) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-expired requires " - "--non-interactive")); - if (opt_state.trust_server_cert_not_yet_valid) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-not-yet-valid requires " - "--non-interactive")); - if (opt_state.trust_server_cert_other_failure) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-other-failure requires " + _("--trust-server-cert-failures requires " "--non-interactive")); } @@ -842,7 +830,8 @@ sub_main(int *exit_code, int argc, const /* Only a few commands can accept a revision range; the rest can take at most one revision number. */ - if (subcommand->cmd_func != svn_cl__null_log) + if (subcommand->cmd_func != svn_cl__null_blame + && subcommand->cmd_func != svn_cl__null_log) { if (opt_state.end_revision.kind != svn_opt_revision_unspecified) { @@ -958,10 +947,9 @@ sub_main(int *exit_code, int argc, const if (err->apr_err == SVN_ERR_CL_INSUFFICIENT_ARGS || err->apr_err == SVN_ERR_CL_ARG_PARSING_ERROR) { - err = svn_error_quick_wrap( - err, apr_psprintf(pool, - _("Try 'svnbench help %s' for more information"), - subcommand->name)); + err = svn_error_quick_wrapf( + err, _("Try 'svnbench help %s' for more information"), + subcommand->name); } if (err->apr_err == SVN_ERR_WC_UPGRADE_REQUIRED) {
