You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2015/11/30 11:24:23 UTC
svn commit: r1717223 [40/50] - in /subversion/branches/ra-git: ./ build/
build/ac-macros/ build/generator/ build/generator/templates/
contrib/hook-scripts/ notes/ notes/api-errata/1.9/ notes/move-tracking/
subversion/ subversion/bindings/ctypes-python/...
Modified: subversion/branches/ra-git/subversion/svn/lock-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn/lock-cmd.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn/lock-cmd.c (original)
+++ subversion/branches/ra-git/subversion/svn/lock-cmd.c Mon Nov 30 10:24:16 2015
@@ -80,6 +80,29 @@ get_comment(const char **comment, svn_cl
return SVN_NO_ERROR;
}
+/* Baton for notify_lock_handler */
+struct notify_lock_baton_t
+{
+ void *inner_baton;
+ svn_wc_notify_func2_t inner_notify;
+ svn_boolean_t had_failure;
+};
+
+/* Implements svn_wc_notify_func2_t for svn_cl__lock */
+static void
+notify_lock_handler(void *baton,
+ const svn_wc_notify_t *notify,
+ apr_pool_t *scratch_pool)
+{
+ struct notify_lock_baton_t *nlb = baton;
+
+ if (notify->action == svn_wc_notify_failed_lock)
+ nlb->had_failure = TRUE;
+
+ if (nlb->inner_notify)
+ nlb->inner_notify(nlb->inner_baton, notify, scratch_pool);
+}
+
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_cl__lock(apr_getopt_t *os,
@@ -90,6 +113,7 @@ svn_cl__lock(apr_getopt_t *os,
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets;
const char *comment;
+ struct notify_lock_baton_t nlb;
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
@@ -106,5 +130,18 @@ svn_cl__lock(apr_getopt_t *os,
SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, pool));
- return svn_client_lock(targets, comment, opt_state->force, ctx, pool);
+ nlb.inner_notify = ctx->notify_func2;
+ nlb.inner_baton = ctx->notify_baton2;
+ nlb.had_failure = FALSE;
+
+ ctx->notify_func2 = notify_lock_handler;
+ ctx->notify_baton2 = &nlb;
+
+ SVN_ERR(svn_client_lock(targets, comment, opt_state->force, ctx, pool));
+
+ if (nlb.had_failure)
+ return svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("One or more locks could not be obtained"));
+
+ return SVN_NO_ERROR;
}
Modified: subversion/branches/ra-git/subversion/svn/notify.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn/notify.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn/notify.c (original)
+++ subversion/branches/ra-git/subversion/svn/notify.c Mon Nov 30 10:24:16 2015
@@ -253,6 +253,13 @@ notify_body(struct notify_baton *nb,
_("Skipped target: '%s' -- copy-source is missing\n"),
path_local));
}
+ else if (n->content_state == svn_wc_notify_state_obstructed)
+ {
+ SVN_ERR(svn_cmdline_printf(
+ pool,
+ _("Skipped '%s' -- obstructed by unversioned node\n"),
+ path_local));
+ }
else
{
SVN_ERR(svn_cmdline_printf(pool, _("Skipped '%s'\n"), path_local));
@@ -415,8 +422,10 @@ notify_body(struct notify_baton *nb,
store_path(nb, nb->conflict_stats->prop_conflicts, path_local);
statchar_buf[1] = 'C';
}
+ else if (n->prop_state == svn_wc_notify_state_merged)
+ statchar_buf[1] = 'G';
else if (n->prop_state == svn_wc_notify_state_changed)
- statchar_buf[1] = 'U';
+ statchar_buf[1] = 'U';
if (statchar_buf[0] != ' ' || statchar_buf[1] != ' ')
{
Modified: subversion/branches/ra-git/subversion/svn/resolve-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn/resolve-cmd.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn/resolve-cmd.c (original)
+++ subversion/branches/ra-git/subversion/svn/resolve-cmd.c Mon Nov 30 10:24:16 2015
@@ -30,6 +30,7 @@
#include "svn_client.h"
#include "svn_error.h"
#include "svn_pools.h"
+#include "svn_hash.h"
#include "cl.h"
#include "svn_private_config.h"
@@ -38,6 +39,259 @@
/*** Code. ***/
+/* Baton for conflict_status_walker */
+struct conflict_status_walker_baton
+{
+ svn_client_ctx_t *ctx;
+ svn_client_conflict_option_id_t option_id;
+ svn_wc_notify_func2_t notify_func;
+ void *notify_baton;
+ svn_boolean_t resolved_one;
+ apr_hash_t *resolve_later;
+ svn_cl__accept_t *accept_which;
+ svn_boolean_t *quit;
+ svn_boolean_t *external_failed;
+ svn_boolean_t *printed_summary;
+ const char *editor_cmd;
+ apr_hash_t *config;
+ const char *path_prefix;
+ svn_cmdline_prompt_baton_t *pb;
+ svn_cl__conflict_stats_t *conflict_stats;
+};
+
+/* Implements svn_wc_notify_func2_t to collect new conflicts caused by
+ resolving a tree conflict. */
+static void
+tree_conflict_collector(void *baton,
+ const svn_wc_notify_t *notify,
+ apr_pool_t *pool)
+{
+ struct conflict_status_walker_baton *cswb = baton;
+
+ if (cswb->notify_func)
+ cswb->notify_func(cswb->notify_baton, notify, pool);
+
+ if (cswb->resolve_later
+ && (notify->action == svn_wc_notify_tree_conflict
+ || notify->prop_state == svn_wc_notify_state_conflicted
+ || notify->content_state == svn_wc_notify_state_conflicted))
+ {
+ if (!svn_hash_gets(cswb->resolve_later, notify->path))
+ {
+ const char *dup_path;
+
+ dup_path = apr_pstrdup(apr_hash_pool_get(cswb->resolve_later),
+ notify->path);
+
+ svn_hash_sets(cswb->resolve_later, dup_path, dup_path);
+ }
+ }
+}
+
+/* Implements svn_wc_status4_t to walk all conflicts to resolve.
+ */
+static svn_error_t *
+conflict_status_walker(void *baton,
+ const char *local_abspath,
+ const svn_wc_status3_t *status,
+ apr_pool_t *scratch_pool)
+{
+ struct conflict_status_walker_baton *cswb = baton;
+ apr_pool_t *iterpool;
+ svn_boolean_t resolved = FALSE;
+ svn_client_conflict_t *conflict;
+
+ if (!status->conflicted)
+ return SVN_NO_ERROR;
+
+ iterpool = svn_pool_create(scratch_pool);
+
+ SVN_ERR(svn_client_conflict_get(&conflict, local_abspath, cswb->ctx,
+ iterpool, iterpool));
+ SVN_ERR(svn_cl__resolve_conflict(&resolved, cswb->accept_which,
+ cswb->quit, cswb->external_failed,
+ cswb->printed_summary,
+ conflict, cswb->editor_cmd,
+ cswb->config, cswb->path_prefix,
+ cswb->pb, cswb->conflict_stats,
+ cswb->option_id, cswb->ctx,
+ scratch_pool));
+ if (resolved)
+ cswb->resolved_one = TRUE;
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+walk_conflicts(svn_client_ctx_t *ctx,
+ const char *local_abspath,
+ svn_depth_t depth,
+ svn_client_conflict_option_id_t option_id,
+ svn_cl__accept_t *accept_which,
+ svn_boolean_t *quit,
+ svn_boolean_t *external_failed,
+ svn_boolean_t *printed_summary,
+ const char *editor_cmd,
+ apr_hash_t *config,
+ const char *path_prefix,
+ svn_cmdline_prompt_baton_t *pb,
+ svn_cl__conflict_stats_t *conflict_stats,
+ apr_pool_t *scratch_pool)
+{
+ struct conflict_status_walker_baton cswb;
+ apr_pool_t *iterpool = NULL;
+ svn_error_t *err;
+
+ if (depth == svn_depth_unknown)
+ depth = svn_depth_infinity;
+
+ cswb.ctx = ctx;
+ cswb.option_id = option_id;
+
+ cswb.resolved_one = FALSE;
+ cswb.resolve_later = (depth != svn_depth_empty)
+ ? apr_hash_make(scratch_pool)
+ : NULL;
+
+ cswb.accept_which = accept_which;
+ cswb.quit = quit;
+ cswb.external_failed = external_failed;
+ cswb.printed_summary = printed_summary;
+ cswb.editor_cmd = editor_cmd;
+ cswb.config = config;
+ cswb.path_prefix = path_prefix;
+ cswb.pb = pb;
+ cswb.conflict_stats = conflict_stats;
+
+
+ /* ### call notify.c code */
+ if (ctx->notify_func2)
+ ctx->notify_func2(ctx->notify_baton2,
+ svn_wc_create_notify(
+ local_abspath,
+ svn_wc_notify_conflict_resolver_starting,
+ scratch_pool),
+ scratch_pool);
+
+ cswb.notify_func = ctx->notify_func2;
+ cswb.notify_baton = ctx->notify_baton2;
+ ctx->notify_func2 = tree_conflict_collector;
+ ctx->notify_baton2 = &cswb;
+
+ err = svn_wc_walk_status(ctx->wc_ctx,
+ local_abspath,
+ depth,
+ FALSE /* get_all */,
+ FALSE /* no_ignore */,
+ TRUE /* ignore_text_mods */,
+ NULL /* ignore_patterns */,
+ conflict_status_walker, &cswb,
+ ctx->cancel_func, ctx->cancel_baton,
+ scratch_pool);
+
+ /* If we got new tree conflicts (or delayed conflicts) during the initial
+ walk, we now walk them one by one as closure. */
+ while (!err && cswb.resolve_later && apr_hash_count(cswb.resolve_later))
+ {
+ apr_hash_index_t *hi;
+ svn_wc_status3_t *status = NULL;
+ const char *tc_abspath = NULL;
+
+ if (iterpool)
+ svn_pool_clear(iterpool);
+ else
+ iterpool = svn_pool_create(scratch_pool);
+
+ hi = apr_hash_first(scratch_pool, cswb.resolve_later);
+ cswb.resolve_later = apr_hash_make(scratch_pool);
+ cswb.resolved_one = FALSE;
+
+ for (; hi && !err; hi = apr_hash_next(hi))
+ {
+ const char *relpath;
+ svn_pool_clear(iterpool);
+
+ tc_abspath = apr_hash_this_key(hi);
+
+ if (ctx->cancel_func)
+ SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
+
+ relpath = svn_dirent_skip_ancestor(local_abspath,
+ tc_abspath);
+
+ if (!relpath
+ || (depth >= svn_depth_empty
+ && depth < svn_depth_infinity
+ && strchr(relpath, '/')))
+ {
+ continue;
+ }
+
+ SVN_ERR(svn_wc_status3(&status, ctx->wc_ctx, tc_abspath,
+ iterpool, iterpool));
+
+ if (depth == svn_depth_files
+ && status->kind == svn_node_dir)
+ continue;
+
+ err = svn_error_trace(conflict_status_walker(&cswb, tc_abspath,
+ status, scratch_pool));
+ }
+
+ /* None of the remaining conflicts got resolved, and non did provide
+ an error...
+
+ We can fix that if we disable the 'resolve_later' option...
+ */
+ if (!cswb.resolved_one && !err && tc_abspath
+ && apr_hash_count(cswb.resolve_later))
+ {
+ /* Run the last resolve operation again. We still have status
+ and tc_abspath for that one. */
+
+ cswb.resolve_later = NULL; /* Produce proper error! */
+
+ /* Recreate the error */
+ err = svn_error_trace(conflict_status_walker(&cswb, tc_abspath,
+ status, scratch_pool));
+
+ SVN_ERR_ASSERT(err != NULL);
+
+ err = svn_error_createf(
+ SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, err,
+ _("Unable to resolve pending conflict on '%s'"),
+ svn_dirent_local_style(tc_abspath, scratch_pool));
+ break;
+ }
+ }
+
+ if (iterpool)
+ svn_pool_destroy(iterpool);
+
+ if (err && err->apr_err != SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE)
+ err = svn_error_createf(
+ SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, err,
+ _("Unable to resolve conflicts on '%s'"),
+ svn_dirent_local_style(local_abspath, scratch_pool));
+
+ ctx->notify_func2 = cswb.notify_func;
+ ctx->notify_baton2 = cswb.notify_baton;
+
+ SVN_ERR(err);
+
+ /* ### call notify.c code */
+ if (ctx->notify_func2)
+ ctx->notify_func2(ctx->notify_baton2,
+ svn_wc_create_notify(local_abspath,
+ svn_wc_notify_conflict_resolver_done,
+ scratch_pool),
+ scratch_pool);
+
+ return SVN_NO_ERROR;
+}
+
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_cl__resolve(apr_getopt_t *os,
@@ -45,39 +299,53 @@ svn_cl__resolve(apr_getopt_t *os,
apr_pool_t *scratch_pool)
{
svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
+ svn_cl__conflict_stats_t *conflict_stats =
+ ((svn_cl__cmd_baton_t *) baton)->conflict_stats;
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
- svn_wc_conflict_choice_t conflict_choice;
+ svn_client_conflict_option_id_t option_id;
svn_error_t *err;
apr_array_header_t *targets;
+ const char *path_prefix;
int i;
apr_pool_t *iterpool;
svn_boolean_t had_error = FALSE;
+ svn_boolean_t quit = FALSE;
+ svn_boolean_t external_failed = FALSE;
+ svn_boolean_t printed_summary = FALSE;
+ svn_cmdline_prompt_baton_t *pb = apr_palloc(scratch_pool, sizeof(*pb));
+
+ pb->cancel_func = ctx->cancel_func;
+ pb->cancel_baton = ctx->cancel_baton;
+
+ option_id = svn_client_conflict_option_unspecified;
+
+ SVN_ERR(svn_dirent_get_absolute(&path_prefix, "", scratch_pool));
switch (opt_state->accept_which)
{
case svn_cl__accept_working:
- conflict_choice = svn_wc_conflict_choose_merged;
+ option_id = svn_wc_conflict_choose_merged;
break;
case svn_cl__accept_base:
- conflict_choice = svn_wc_conflict_choose_base;
+ option_id = svn_wc_conflict_choose_base;
break;
case svn_cl__accept_theirs_conflict:
- conflict_choice = svn_wc_conflict_choose_theirs_conflict;
+ option_id = svn_wc_conflict_choose_theirs_conflict;
break;
case svn_cl__accept_mine_conflict:
- conflict_choice = svn_wc_conflict_choose_mine_conflict;
+ option_id = svn_wc_conflict_choose_mine_conflict;
break;
case svn_cl__accept_theirs_full:
- conflict_choice = svn_wc_conflict_choose_theirs_full;
+ option_id = svn_wc_conflict_choose_theirs_full;
break;
case svn_cl__accept_mine_full:
- conflict_choice = svn_wc_conflict_choose_mine_full;
+ option_id = svn_wc_conflict_choose_mine_full;
break;
case svn_cl__accept_unspecified:
if (opt_state->non_interactive)
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("missing --accept option"));
- conflict_choice = svn_wc_conflict_choose_unspecified;
+ option_id = svn_wc_conflict_choose_unspecified;
break;
default:
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
@@ -107,12 +375,40 @@ svn_cl__resolve(apr_getopt_t *os,
for (i = 0; i < targets->nelts; i++)
{
const char *target = APR_ARRAY_IDX(targets, i, const char *);
+ const char *local_abspath;
+ svn_client_conflict_t *conflict;
+
svn_pool_clear(iterpool);
+
SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
- err = svn_client_resolve(target,
- opt_state->depth, conflict_choice,
- ctx,
- iterpool);
+
+ SVN_ERR(svn_dirent_get_absolute(&local_abspath, target, iterpool));
+
+ if (opt_state->depth == svn_depth_empty)
+ {
+ svn_boolean_t resolved;
+
+ SVN_ERR(svn_client_conflict_get(&conflict, local_abspath, ctx,
+ iterpool, iterpool));
+ err = svn_cl__resolve_conflict(&resolved,
+ &opt_state->accept_which,
+ &quit, &external_failed,
+ &printed_summary,
+ conflict, opt_state->editor_cmd,
+ ctx->config, path_prefix,
+ pb, conflict_stats,
+ option_id, ctx,
+ iterpool);
+ }
+ else
+ {
+ err = walk_conflicts(ctx, local_abspath, opt_state->depth,
+ option_id, &opt_state->accept_which,
+ &quit, &external_failed, &printed_summary,
+ opt_state->editor_cmd, ctx->config,
+ path_prefix, pb, conflict_stats, iterpool);
+ }
+
if (err)
{
svn_handle_warning2(stderr, err, "svn: ");
Modified: subversion/branches/ra-git/subversion/svn/similarity.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn/similarity.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn/similarity.c (original)
+++ subversion/branches/ra-git/subversion/svn/similarity.c Mon Nov 30 10:24:16 2015
@@ -114,6 +114,8 @@ svn_cl__similarity_check(const char *key
{
svn_cl__simcheck_t *const token = tokens[i];
token->context = NULL;
+ /* If you update this factor, consider updating
+ * ../libsvn_subr/cmdline.c:most_similar(). */
if (token->score >= (2 * SVN_STRING__SIM_RANGE_MAX + 1) / 3)
++result;
}
Modified: subversion/branches/ra-git/subversion/svn/status-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn/status-cmd.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn/status-cmd.c (original)
+++ subversion/branches/ra-git/subversion/svn/status-cmd.c Mon Nov 30 10:24:16 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/ra-git/subversion/svn/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn/status.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn/status.c (original)
+++ subversion/branches/ra-git/subversion/svn/status.c Mon Nov 30 10:24:16 2015
@@ -282,11 +282,16 @@ print_status(const char *target_abspath,
if (tree_conflicted)
{
- const svn_wc_conflict_description2_t *tree_conflict;
- SVN_ERR(svn_wc__get_tree_conflict(&tree_conflict, ctx->wc_ctx,
+ const svn_wc_conflict_description2_t *desc2;
+ svn_client_conflict_t *tree_conflict;
+
+ SVN_ERR(svn_wc__get_tree_conflict(&desc2, ctx->wc_ctx,
local_abspath, pool, pool));
- SVN_ERR_ASSERT(tree_conflict != NULL);
+ SVN_ERR_ASSERT(desc2 != NULL);
+ SVN_ERR(svn_client_conflict_from_wc_description2_t(&tree_conflict,
+ desc2,
+ pool, pool));
tree_status_code = 'C';
SVN_ERR(svn_cl__get_human_readable_tree_conflict_description(
&desc, tree_conflict, pool));
Modified: subversion/branches/ra-git/subversion/svn/svn.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn/svn.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn/svn.c (original)
+++ subversion/branches/ra-git/subversion/svn/svn.c Mon Nov 30 10:24:16 2015
@@ -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,
@@ -243,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"
" "
@@ -408,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,
@@ -425,7 +415,39 @@ const apr_getopt_option_t svn_cl__option
" "
"current revision (recommended when tagging)")},
{"show-item", opt_show_item, 1,
- N_("print only the item identified by ARG")},
+ N_("print only the item identified by ARG:\n"
+ " "
+ " 'kind' node kind of TARGET\n"
+ " "
+ " 'url' URL of TARGET in the repository\n"
+ " "
+ " 'relative-url'\n"
+ " "
+ " repository-relative URL of TARGET\n"
+ " "
+ " 'repos-root-url'\n"
+ " "
+ " root URL of repository\n"
+ " "
+ " 'repos-uuid' UUID of repository\n"
+ " "
+ " 'revision' specified or implied revision\n"
+ " "
+ " 'last-changed-revision'\n"
+ " "
+ " last change of TARGET at or before\n"
+ " "
+ " 'revision'\n"
+ " "
+ " 'last-changed-date'\n"
+ " "
+ " date of 'last-changed-revision'\n"
+ " "
+ " 'last-changed-author'\n"
+ " "
+ " author of 'last-changed-revision'\n"
+ " "
+ " 'wc-root' root of TARGET's working copy")},
/* Long-opt Aliases
*
@@ -459,9 +481,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
};
@@ -738,23 +758,12 @@ const svn_opt_subcommand_desc2_t svn_cl_
"usage: info [TARGET[@REV]...]\n"
"\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"
+ " TARGET may be either a working-copy path or a URL. If specified, REV\n"
+ " determines in which revision the target is first looked up; the default\n"
+ " is HEAD for a URL or BASE for a WC path.\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"),
+ " about TARGET.\n"),
{'r', 'R', opt_depth, opt_targets, opt_incremental, opt_xml,
opt_changelist, opt_include_externals, opt_show_item, opt_no_newline}
},
@@ -1457,6 +1466,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"
@@ -1638,8 +1654,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_
@@ -2185,20 +2201,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;
@@ -2265,7 +2278,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;
@@ -2635,25 +2648,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"));
}
@@ -2792,6 +2793,7 @@ sub_main(int *exit_code, int argc, const
/* Create a client context object. */
command_baton.opt_state = &opt_state;
+ command_baton.conflict_stats = conflict_stats;
SVN_ERR(svn_client_create_context2(&ctx, cfg_hash, pool));
command_baton.ctx = ctx;
Modified: subversion/branches/ra-git/subversion/svn/unlock-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn/unlock-cmd.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn/unlock-cmd.c (original)
+++ subversion/branches/ra-git/subversion/svn/unlock-cmd.c Mon Nov 30 10:24:16 2015
@@ -39,6 +39,29 @@
/*** Code. ***/
+/* Baton for notify_unlock_handler */
+struct notify_unlock_baton_t
+{
+ void *inner_baton;
+ svn_wc_notify_func2_t inner_notify;
+ svn_boolean_t had_failure;
+};
+
+/* Implements svn_wc_notify_func2_t for svn_cl__unlock */
+static void
+notify_unlock_handler(void *baton,
+ const svn_wc_notify_t *notify,
+ apr_pool_t *scratch_pool)
+{
+ struct notify_unlock_baton_t *nub = baton;
+
+ if (notify->action == svn_wc_notify_failed_unlock)
+ nub->had_failure = TRUE;
+
+ if (nub->inner_notify)
+ nub->inner_notify(nub->inner_baton, notify, scratch_pool);
+}
+
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
@@ -49,6 +72,7 @@ svn_cl__unlock(apr_getopt_t *os,
svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets;
+ struct notify_unlock_baton_t nub;
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
@@ -63,6 +87,18 @@ svn_cl__unlock(apr_getopt_t *os,
SVN_ERR(svn_cl__assert_homogeneous_target_type(targets));
- return svn_error_trace(
- svn_client_unlock(targets, opt_state->force, ctx, scratch_pool));
+ nub.inner_notify = ctx->notify_func2;
+ nub.inner_baton = ctx->notify_baton2;
+ nub.had_failure = FALSE;
+
+ ctx->notify_func2 = notify_unlock_handler;
+ ctx->notify_baton2 = &nub;
+
+ SVN_ERR(svn_client_unlock(targets, opt_state->force, ctx, scratch_pool));
+
+ if (nub.had_failure)
+ return svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("One or more locks could not be released"));
+
+ return SVN_NO_ERROR;
}
Modified: subversion/branches/ra-git/subversion/svn/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn/util.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn/util.c (original)
+++ subversion/branches/ra-git/subversion/svn/util.c Mon Nov 30 10:24:16 2015
@@ -907,14 +907,17 @@ svn_cl__time_cstring_to_human_cstring(co
}
const char *
-svn_cl__node_description(const svn_wc_conflict_version_t *node,
+svn_cl__node_description(const char *repos_root_url,
+ const char *repos_relpath,
+ svn_revnum_t peg_rev,
+ svn_node_kind_t node_kind,
const char *wc_repos_root_URL,
apr_pool_t *pool)
{
const char *root_str = "^";
const char *path_str = "...";
- if (!node)
+ if (!repos_root_url || !repos_relpath || !SVN_IS_VALID_REVNUM(peg_rev))
/* Printing "(none)" the harder way to ensure conformity (mostly with
* translations). */
return apr_psprintf(pool, "(%s)",
@@ -923,18 +926,18 @@ svn_cl__node_description(const svn_wc_co
/* Construct a "caret notation" ^/URL if NODE matches WC_REPOS_ROOT_URL.
* Otherwise show the complete URL, and if we can't, show dots. */
- if (node->repos_url &&
+ if (repos_root_url &&
(wc_repos_root_URL == NULL ||
- strcmp(node->repos_url, wc_repos_root_URL) != 0))
- root_str = node->repos_url;
+ strcmp(repos_root_url, wc_repos_root_URL) != 0))
+ root_str = repos_root_url;
- if (node->path_in_repos)
- path_str = node->path_in_repos;
+ if (repos_relpath)
+ path_str = repos_relpath;
return apr_psprintf(pool, "(%s) %s@%ld",
- svn_cl__node_kind_str_human_readable(node->node_kind),
+ svn_cl__node_kind_str_human_readable(node_kind),
svn_path_url_add_component2(root_str, path_str, pool),
- node->peg_rev);
+ peg_rev);
}
svn_error_t *
Modified: subversion/branches/ra-git/subversion/svn_private_config.hw
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svn_private_config.hw?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svn_private_config.hw (original)
+++ subversion/branches/ra-git/subversion/svn_private_config.hw Mon Nov 30 10:24:16 2015
@@ -122,6 +122,14 @@
Supresses compiler warnings about the variable being unused. */
#define SVN_UNUSED(v) ( (void)(v) )
+#if defined(_MSC_VER) && _MSC_VER >= 1600
+#define HAVE_STDINT_H
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER >= 1800
+#define HAVE_STDBOOL_H
+#endif
+
#endif /* SVN_PRIVATE_CONFIG_HW */
/* Inclusion of Berkeley DB header */
Modified: subversion/branches/ra-git/subversion/svnadmin/svnadmin.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svnadmin/svnadmin.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svnadmin/svnadmin.c (original)
+++ subversion/branches/ra-git/subversion/svnadmin/svnadmin.c Mon Nov 30 10:24:16 2015
@@ -166,11 +166,13 @@ static svn_opt_subcommand_t
subcommand_delrevprop,
subcommand_deltify,
subcommand_dump,
+ subcommand_dump_revprops,
subcommand_freeze,
subcommand_help,
subcommand_hotcopy,
subcommand_info,
subcommand_load,
+ subcommand_load_revprops,
subcommand_list_dblogs,
subcommand_list_unused_dblogs,
subcommand_lock,
@@ -392,6 +394,15 @@ static const svn_opt_subcommand_desc2_t
"changed in those revisions.)\n"),
{'r', svnadmin__incremental, svnadmin__deltas, 'q', 'M'} },
+ {"dump-revprops", subcommand_dump_revprops, {0}, N_
+ ("usage: svnadmin dump-revprops REPOS_PATH [-r LOWER[:UPPER]]\n\n"
+ "Dump the revision properties of filesystem to stdout in a 'dumpfile'\n"
+ "portable format, sending feedback to stderr. Dump revisions\n"
+ "LOWER rev through UPPER rev. If no revisions are given, dump the\n"
+ "properties for all revisions. If only LOWER is given, dump the\n"
+ "properties for that one revision.\n"),
+ {'r', 'q'} },
+
{"freeze", subcommand_freeze, {0}, N_
("usage: 1. svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n"
" 2. svnadmin freeze -F FILE PROGRAM [ARG...]\n\n"
@@ -444,6 +455,15 @@ static const svn_opt_subcommand_desc2_t
svnadmin__use_pre_commit_hook, svnadmin__use_post_commit_hook,
svnadmin__parent_dir, svnadmin__bypass_prop_validation, 'M'} },
+ {"load-revprops", subcommand_load_revprops, {0}, N_
+ ("usage: svnadmin load-revprops REPOS_PATH\n\n"
+ "Read a 'dumpfile'-formatted stream from stdin, setting the revision\n"
+ "properties in the repository's filesystem. Revisions not found in the\n"
+ "repository will cause an error. Progress feedback is sent to stdout.\n"
+ "If --revision is specified, limit the loaded revisions to only those\n"
+ "in the dump stream whose revision numbers match the specified range.\n"),
+ {'q', 'r', svnadmin__force_uuid, svnadmin__bypass_prop_validation} },
+
{"lock", subcommand_lock, {0}, N_
("usage: svnadmin lock REPOS_PATH PATH USERNAME COMMENT-FILE [TOKEN]\n\n"
"Lock PATH by USERNAME setting comments from COMMENT-FILE.\n"
@@ -459,8 +479,12 @@ static const svn_opt_subcommand_desc2_t
{"lstxns", subcommand_lstxns, {0}, N_
("usage: svnadmin lstxns REPOS_PATH\n\n"
- "Print the names of all uncommitted transactions.\n"),
- {0} },
+ "Print the names of uncommitted transactions. With -rN skip the output\n"
+ "of those that have a base revision more recent than rN. Transactions\n"
+ "with base revisions much older than HEAD are likely to have been\n"
+ "abandonded and are candidates to be removed.\n"),
+ {'r'},
+ { {'r', "transaction base revision ARG"} } },
{"pack", subcommand_pack, {0}, N_
("usage: svnadmin pack REPOS_PATH\n\n"
@@ -864,17 +888,60 @@ err_cleanup(void *data)
return APR_SUCCESS;
}
-struct repos_notify_handler_baton {
- /* Stream to write progress and other non-error output to. */
- svn_stream_t *feedback_stream;
+struct repos_verify_callback_baton
+{
+ /* Should we continue after receiving a first verification error? */
+ svn_boolean_t keep_going;
/* List of errors encountered during 'svnadmin verify --keep-going'. */
apr_array_header_t *error_summary;
- /* Pool for data collected during notifications. */
+ /* Pool for data collected during callback invocations. */
apr_pool_t *result_pool;
};
+/* Implementation of svn_repos_verify_callback_t to handle errors coming
+ from svn_repos_verify_fs3(). */
+static svn_error_t *
+repos_verify_callback(void *baton,
+ svn_revnum_t revision,
+ svn_error_t *verify_err,
+ apr_pool_t *scratch_pool)
+{
+ struct repos_verify_callback_baton *b = baton;
+
+ if (revision == SVN_INVALID_REVNUM)
+ {
+ SVN_ERR(svn_cmdline_fputs(_("* Error verifying repository metadata.\n"),
+ stderr, scratch_pool));
+ }
+ else
+ {
+ SVN_ERR(svn_cmdline_fprintf(stderr, scratch_pool,
+ _("* Error verifying revision %ld.\n"),
+ revision));
+ }
+
+ if (b->keep_going)
+ {
+ struct verification_error *verr;
+
+ svn_handle_error2(verify_err, stderr, FALSE, "svnadmin: ");
+
+ /* Remember the error in B->ERROR_SUMMARY. */
+ verr = apr_palloc(b->result_pool, sizeof(*verr));
+ verr->rev = revision;
+ verr->err = svn_error_dup(verify_err);
+ apr_pool_cleanup_register(b->result_pool, verr->err, err_cleanup,
+ apr_pool_cleanup_null);
+ APR_ARRAY_PUSH(b->error_summary, struct verification_error *) = verr;
+
+ return SVN_NO_ERROR;
+ }
+ else
+ return svn_error_trace(svn_error_dup(verify_err));
+}
+
/* Implementation of svn_repos_notify_func_t to wrap the output to a
response stream for svn_repos_dump_fs2(), svn_repos_verify_fs(),
svn_repos_hotcopy3() and others. */
@@ -883,8 +950,7 @@ repos_notify_handler(void *baton,
const svn_repos_notify_t *notify,
apr_pool_t *scratch_pool)
{
- struct repos_notify_handler_baton *b = baton;
- svn_stream_t *feedback_stream = b->feedback_stream;
+ svn_stream_t *feedback_stream = baton;
switch (notify->action)
{
@@ -894,30 +960,6 @@ repos_notify_handler(void *baton,
notify->warning_str));
return;
- case svn_repos_notify_failure:
- if (notify->revision != SVN_INVALID_REVNUM)
- svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
- _("* Error verifying revision %ld.\n"),
- notify->revision));
- if (notify->err)
- {
- 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);
- apr_pool_cleanup_register(b->result_pool, verr->err, err_cleanup,
- apr_pool_cleanup_null);
- APR_ARRAY_PUSH(b->error_summary,
- struct verification_error *) = verr;
- }
- }
- return;
-
case svn_repos_notify_dump_rev_end:
svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
_("* Dumped revision %ld.\n"),
@@ -1071,8 +1113,7 @@ repos_notify_handler(void *baton,
"%" APR_INT64_T_FMT,
notify->shard);
svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
- _("Packing revision properties"
- " in shard %s..."),
+ _("Packed revision properties in shard %s\n"),
shardstr));
return;
}
@@ -1083,8 +1124,8 @@ repos_notify_handler(void *baton,
"%" APR_INT64_T_FMT,
notify->shard);
svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
- _("Removing non-packed revision properties"
- " in shard %s..."),
+ _("Removed non-packed revision properties"
+ " in shard %s\n"),
shardstr));
return;
}
@@ -1108,6 +1149,24 @@ repos_notify_handler(void *baton,
_("* Copied revisions from %ld to %ld.\n"),
notify->start_revision, notify->end_revision));
}
+ return;
+
+ case svn_repos_notify_pack_noop:
+ /* For best backward compatibility, we keep silent if there were just
+ no more shards to pack. */
+ if (notify->shard == -1)
+ {
+ svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ _("svnadmin: Warning - this repository is not sharded."
+ " Packing has no effect.\n")));
+ }
+ return;
+
+ case svn_repos_notify_load_revprop_set:
+ svn_error_clear(svn_stream_printf(feedback_stream, scratch_pool,
+ _("Properties set on revision %ld.\n"),
+ notify->new_revision));
+ return;
default:
return;
@@ -1154,57 +1213,106 @@ recode_stream_create(FILE *std_stream, a
return rw_stream;
}
-
-/* This implements `svn_opt_subcommand_t'. */
-static svn_error_t *
-subcommand_dump(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+/* Read the min / max revision from the OPT_STATE, verify them against REPOS
+ and return them in *LOWER and *UPPER, respectively. Use SCRATCH_POOL
+ for temporary allocations. */
+static svn_error_t *
+get_dump_range(svn_revnum_t *lower,
+ svn_revnum_t *upper,
+ svn_repos_t *repos,
+ struct svnadmin_opt_state *opt_state,
+ apr_pool_t *scratch_pool)
{
- struct svnadmin_opt_state *opt_state = baton;
- svn_repos_t *repos;
svn_fs_t *fs;
- svn_stream_t *stdout_stream;
- svn_revnum_t lower = SVN_INVALID_REVNUM, upper = SVN_INVALID_REVNUM;
svn_revnum_t youngest;
- struct repos_notify_handler_baton notify_baton = { 0 };
- /* Expect no more arguments. */
- SVN_ERR(parse_args(NULL, os, 0, 0, pool));
+ *lower = SVN_INVALID_REVNUM;
+ *upper = SVN_INVALID_REVNUM;
- SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
fs = svn_repos_fs(repos);
- SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool));
+ SVN_ERR(svn_fs_youngest_rev(&youngest, fs, scratch_pool));
/* Find the revision numbers at which to start and end. */
- SVN_ERR(get_revnum(&lower, &opt_state->start_revision,
- youngest, repos, pool));
- SVN_ERR(get_revnum(&upper, &opt_state->end_revision,
- youngest, repos, pool));
+ SVN_ERR(get_revnum(lower, &opt_state->start_revision,
+ youngest, repos, scratch_pool));
+ SVN_ERR(get_revnum(upper, &opt_state->end_revision,
+ youngest, repos, scratch_pool));
/* Fill in implied revisions if necessary. */
- if (lower == SVN_INVALID_REVNUM)
+ if (*lower == SVN_INVALID_REVNUM)
{
- lower = 0;
- upper = youngest;
+ *lower = 0;
+ *upper = youngest;
}
- else if (upper == SVN_INVALID_REVNUM)
+ else if (*upper == SVN_INVALID_REVNUM)
{
- upper = lower;
+ *upper = *lower;
}
- if (lower > upper)
+ if (*lower > *upper)
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("First revision cannot be higher than second"));
+ return SVN_NO_ERROR;
+}
+
+/* This implements `svn_opt_subcommand_t'. */
+static svn_error_t *
+subcommand_dump(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ struct svnadmin_opt_state *opt_state = baton;
+ svn_repos_t *repos;
+ svn_stream_t *stdout_stream;
+ svn_revnum_t lower, upper;
+ svn_stream_t *feedback_stream = NULL;
+
+ /* Expect no more arguments. */
+ SVN_ERR(parse_args(NULL, os, 0, 0, pool));
+
+ SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
+ SVN_ERR(get_dump_range(&lower, &upper, repos, opt_state, pool));
+
SVN_ERR(svn_stream_for_stdout(&stdout_stream, pool));
/* Progress feedback goes to STDERR, unless they asked to suppress it. */
if (! opt_state->quiet)
- notify_baton.feedback_stream = recode_stream_create(stderr, pool);
+ feedback_stream = recode_stream_create(stderr, pool);
- SVN_ERR(svn_repos_dump_fs3(repos, stdout_stream, lower, upper,
+ SVN_ERR(svn_repos_dump_fs4(repos, stdout_stream, lower, upper,
opt_state->incremental, opt_state->use_deltas,
+ TRUE, TRUE,
!opt_state->quiet ? repos_notify_handler : NULL,
- ¬ify_baton, check_cancel, NULL, pool));
+ feedback_stream, check_cancel, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* This implements `svn_opt_subcommand_t'. */
+static svn_error_t *
+subcommand_dump_revprops(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ struct svnadmin_opt_state *opt_state = baton;
+ svn_repos_t *repos;
+ svn_stream_t *stdout_stream;
+ svn_revnum_t lower, upper;
+ svn_stream_t *feedback_stream = NULL;
+
+ /* Expect no more arguments. */
+ SVN_ERR(parse_args(NULL, os, 0, 0, pool));
+
+ SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
+ SVN_ERR(get_dump_range(&lower, &upper, repos, opt_state, pool));
+
+ SVN_ERR(svn_stream_for_stdout(&stdout_stream, pool));
+
+ /* Progress feedback goes to STDERR, unless they asked to suppress it. */
+ if (! opt_state->quiet)
+ feedback_stream = recode_stream_create(stderr, pool);
+
+ SVN_ERR(svn_repos_dump_fs4(repos, stdout_stream, lower, upper,
+ FALSE, FALSE, TRUE, FALSE,
+ !opt_state->quiet ? repos_notify_handler : NULL,
+ feedback_stream, check_cancel, NULL, pool));
return SVN_NO_ERROR;
}
@@ -1344,51 +1452,65 @@ optrev_to_revnum(svn_revnum_t *revnum, c
return SVN_NO_ERROR;
}
-
-/* This implements `svn_opt_subcommand_t'. */
+/* Read the min / max revision from the OPT_STATE, verify them and return
+ them in *LOWER and *UPPER, respectively. */
static svn_error_t *
-subcommand_load(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+get_load_range(svn_revnum_t *lower,
+ svn_revnum_t *upper,
+ struct svnadmin_opt_state *opt_state)
{
- svn_error_t *err;
- struct svnadmin_opt_state *opt_state = baton;
- svn_repos_t *repos;
- svn_revnum_t lower = SVN_INVALID_REVNUM, upper = SVN_INVALID_REVNUM;
- svn_stream_t *stdin_stream;
- struct repos_notify_handler_baton notify_baton = { 0 };
-
- /* Expect no more arguments. */
- SVN_ERR(parse_args(NULL, os, 0, 0, pool));
-
/* Find the revision numbers at which to start and end. We only
support a limited set of revision kinds: number and unspecified. */
- SVN_ERR(optrev_to_revnum(&lower, &opt_state->start_revision));
- SVN_ERR(optrev_to_revnum(&upper, &opt_state->end_revision));
+ SVN_ERR(optrev_to_revnum(lower, &opt_state->start_revision));
+ SVN_ERR(optrev_to_revnum(upper, &opt_state->end_revision));
/* Fill in implied revisions if necessary. */
- if ((upper == SVN_INVALID_REVNUM) && (lower != SVN_INVALID_REVNUM))
+ if ((*upper == SVN_INVALID_REVNUM) && (*lower != SVN_INVALID_REVNUM))
{
- upper = lower;
+ *upper = *lower;
}
- else if ((upper != SVN_INVALID_REVNUM) && (lower == SVN_INVALID_REVNUM))
+ else if ((*upper != SVN_INVALID_REVNUM) && (*lower == SVN_INVALID_REVNUM))
{
- lower = upper;
+ *lower = *upper;
}
/* Ensure correct range ordering. */
- if (lower > upper)
+ if (*lower > *upper)
{
return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
_("First revision cannot be higher than second"));
}
+ return SVN_NO_ERROR;
+}
+
+
+/* This implements `svn_opt_subcommand_t'. */
+static svn_error_t *
+subcommand_load(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ svn_error_t *err;
+ struct svnadmin_opt_state *opt_state = baton;
+ svn_repos_t *repos;
+ svn_revnum_t lower, upper;
+ svn_stream_t *stdin_stream;
+ svn_stream_t *feedback_stream = NULL;
+
+ /* Expect no more arguments. */
+ SVN_ERR(parse_args(NULL, os, 0, 0, pool));
+
+ /* Find the revision numbers at which to start and end. We only
+ support a limited set of revision kinds: number and unspecified. */
+ SVN_ERR(get_load_range(&lower, &upper, opt_state));
+
SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
/* Read the stream from STDIN. Users can redirect a file. */
- SVN_ERR(svn_stream_for_stdin(&stdin_stream, pool));
+ SVN_ERR(svn_stream_for_stdin2(&stdin_stream, TRUE, pool));
/* Progress feedback goes to STDOUT, unless they asked to suppress it. */
if (! opt_state->quiet)
- notify_baton.feedback_stream = recode_stream_create(stdout, pool);
+ feedback_stream = recode_stream_create(stdout, pool);
err = svn_repos_load_fs5(repos, stdin_stream, lower, upper,
opt_state->uuid_action, opt_state->parent_dir,
@@ -1397,7 +1519,7 @@ subcommand_load(apr_getopt_t *os, void *
!opt_state->bypass_prop_validation,
opt_state->ignore_dates,
opt_state->quiet ? NULL : repos_notify_handler,
- ¬ify_baton, check_cancel, NULL, pool);
+ feedback_stream, check_cancel, NULL, pool);
if (err && err->apr_err == SVN_ERR_BAD_PROPERTY_VALUE)
return svn_error_quick_wrap(err,
_("Invalid property value found in "
@@ -1407,6 +1529,47 @@ subcommand_load(apr_getopt_t *os, void *
return err;
}
+static svn_error_t *
+subcommand_load_revprops(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ svn_error_t *err;
+ struct svnadmin_opt_state *opt_state = baton;
+ svn_repos_t *repos;
+ svn_revnum_t lower, upper;
+ svn_stream_t *stdin_stream;
+
+ svn_stream_t *feedback_stream = NULL;
+
+ /* Expect no more arguments. */
+ SVN_ERR(parse_args(NULL, os, 0, 0, pool));
+
+ /* Find the revision numbers at which to start and end. We only
+ support a limited set of revision kinds: number and unspecified. */
+ SVN_ERR(get_load_range(&lower, &upper, opt_state));
+
+ SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
+
+ /* Read the stream from STDIN. Users can redirect a file. */
+ SVN_ERR(svn_stream_for_stdin2(&stdin_stream, TRUE, pool));
+
+ /* Progress feedback goes to STDOUT, unless they asked to suppress it. */
+ if (! opt_state->quiet)
+ feedback_stream = recode_stream_create(stdout, pool);
+
+ err = svn_repos_load_fs_revprops(repos, stdin_stream, lower, upper,
+ !opt_state->bypass_prop_validation,
+ opt_state->ignore_dates,
+ opt_state->quiet ? NULL
+ : repos_notify_handler,
+ feedback_stream, check_cancel, NULL, pool);
+ if (err && err->apr_err == SVN_ERR_BAD_PROPERTY_VALUE)
+ return svn_error_quick_wrap(err,
+ _("Invalid property value found in "
+ "dumpstream; consider repairing the source "
+ "or using --bypass-prop-validation while "
+ "loading."));
+ return err;
+}
/* This implements `svn_opt_subcommand_t'. */
static svn_error_t *
@@ -1416,21 +1579,46 @@ subcommand_lstxns(apr_getopt_t *os, void
svn_repos_t *repos;
svn_fs_t *fs;
apr_array_header_t *txns;
+ apr_pool_t *iterpool;
+ svn_revnum_t youngest, limit;
int i;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
+ if (opt_state->end_revision.kind != svn_opt_revision_unspecified)
+ return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+ _("Revision range is not allowed"));
SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
fs = svn_repos_fs(repos);
SVN_ERR(svn_fs_list_transactions(&txns, fs, pool));
- /* Loop, printing revisions. */
+ SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool));
+ SVN_ERR(get_revnum(&limit, &opt_state->start_revision, youngest, repos,
+ pool));
+
+ iterpool = svn_pool_create(pool);
for (i = 0; i < txns->nelts; i++)
{
- SVN_ERR(svn_cmdline_printf(pool, "%s\n",
- APR_ARRAY_IDX(txns, i, const char *)));
+ const char *name = APR_ARRAY_IDX(txns, i, const char *);
+ svn_boolean_t show = TRUE;
+
+ svn_pool_clear(iterpool);
+ if (limit != SVN_INVALID_REVNUM)
+ {
+ svn_fs_txn_t *txn;
+ svn_revnum_t base;
+
+ SVN_ERR(svn_fs_open_txn(&txn, fs, name, iterpool));
+ base = svn_fs_txn_base_revision(txn);
+
+ if (base > limit)
+ show = FALSE;
+ }
+ if (show)
+ SVN_ERR(svn_cmdline_printf(pool, "%s\n", name));
}
+ svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
@@ -1444,12 +1632,12 @@ subcommand_recover(apr_getopt_t *os, voi
svn_repos_t *repos;
svn_error_t *err;
struct svnadmin_opt_state *opt_state = baton;
- struct repos_notify_handler_baton notify_baton = { 0 };
+ svn_stream_t *feedback_stream = NULL;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
- SVN_ERR(svn_stream_for_stdout(¬ify_baton.feedback_stream, pool));
+ SVN_ERR(svn_stream_for_stdout(&feedback_stream, pool));
/* Restore default signal handlers until after we have acquired the
* exclusive lock so that the user interrupt before we actually
@@ -1457,7 +1645,7 @@ subcommand_recover(apr_getopt_t *os, voi
setup_cancellation_signals(SIG_DFL);
err = svn_repos_recover4(opt_state->repository_path, TRUE,
- repos_notify_handler, ¬ify_baton,
+ repos_notify_handler, feedback_stream,
check_cancel, NULL, pool);
if (err)
{
@@ -1475,7 +1663,7 @@ subcommand_recover(apr_getopt_t *os, voi
" another process has it open?\n")));
SVN_ERR(svn_cmdline_fflush(stdout));
SVN_ERR(svn_repos_recover4(opt_state->repository_path, FALSE,
- repos_notify_handler, ¬ify_baton,
+ repos_notify_handler, feedback_stream,
check_cancel, NULL, pool));
}
@@ -1761,7 +1949,7 @@ subcommand_pack(apr_getopt_t *os, void *
{
struct svnadmin_opt_state *opt_state = baton;
svn_repos_t *repos;
- struct repos_notify_handler_baton notify_baton = { 0 };
+ svn_stream_t *feedback_stream = NULL;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
@@ -1770,11 +1958,11 @@ subcommand_pack(apr_getopt_t *os, void *
/* Progress feedback goes to STDOUT, unless they asked to suppress it. */
if (! opt_state->quiet)
- notify_baton.feedback_stream = recode_stream_create(stdout, pool);
+ feedback_stream = recode_stream_create(stdout, pool);
return svn_error_trace(
svn_repos_fs_pack2(repos, !opt_state->quiet ? repos_notify_handler : NULL,
- ¬ify_baton, check_cancel, NULL, pool));
+ feedback_stream, check_cancel, NULL, pool));
}
@@ -1786,8 +1974,8 @@ subcommand_verify(apr_getopt_t *os, void
svn_repos_t *repos;
svn_fs_t *fs;
svn_revnum_t youngest, lower, upper;
- struct repos_notify_handler_baton notify_baton = { 0 };
- svn_error_t *verify_err;
+ svn_stream_t *feedback_stream = NULL;
+ struct repos_verify_callback_baton verify_baton = { 0 };
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
@@ -1831,26 +2019,27 @@ subcommand_verify(apr_getopt_t *os, void
upper = lower;
}
- if (! opt_state->quiet)
- notify_baton.feedback_stream = recode_stream_create(stdout, pool);
+ if (!opt_state->quiet)
+ 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 *));
-
- notify_baton.result_pool = pool;
-
- 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);
+ verify_baton.keep_going = opt_state->keep_going;
+ verify_baton.error_summary =
+ apr_array_make(pool, 0, sizeof(struct verification_error *));
+ verify_baton.result_pool = pool;
+
+ SVN_ERR(svn_repos_verify_fs3(repos, lower, upper,
+ opt_state->check_normalization,
+ opt_state->metadata_only,
+ !opt_state->quiet
+ ? repos_notify_handler : NULL,
+ feedback_stream,
+ repos_verify_callback, &verify_baton,
+ 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
+ && verify_baton.error_summary->nelts > 0)
{
int rev_maxlength;
svn_revnum_t end_revnum;
@@ -1858,15 +2047,15 @@ subcommand_verify(apr_getopt_t *os, void
int i;
svn_error_clear(
- svn_stream_puts(notify_baton.feedback_stream,
+ svn_stream_puts(feedback_stream,
_("\n-----Summary of corrupt revisions-----\n")));
/* The standard column width for the revision number is 6 characters.
If the revision number can potentially be larger (i.e. if end_revnum
is larger than 1000000), we increase the column width as needed. */
rev_maxlength = 6;
- end_revnum = APR_ARRAY_IDX(notify_baton.error_summary,
- notify_baton.error_summary->nelts - 1,
+ end_revnum = APR_ARRAY_IDX(verify_baton.error_summary,
+ verify_baton.error_summary->nelts - 1,
struct verification_error *)->rev;
while (end_revnum >= 1000000)
{
@@ -1875,7 +2064,7 @@ subcommand_verify(apr_getopt_t *os, void
}
iterpool = svn_pool_create(pool);
- for (i = 0; i < notify_baton.error_summary->nelts; i++)
+ for (i = 0; i < verify_baton.error_summary->nelts; i++)
{
struct verification_error *verr;
svn_error_t *err;
@@ -1883,29 +2072,40 @@ subcommand_verify(apr_getopt_t *os, void
svn_pool_clear(iterpool);
- verr = APR_ARRAY_IDX(notify_baton.error_summary, i,
+ verr = APR_ARRAY_IDX(verify_baton.error_summary, i,
struct verification_error *);
- rev_str = apr_psprintf(iterpool, "r%ld", verr->rev);
- rev_str = apr_psprintf(iterpool, "%*s", rev_maxlength, rev_str);
- for (err = svn_error_purge_tracing(verr->err);
- err != SVN_NO_ERROR; err = err->child)
- {
- 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,
- "%s: E%06d: %s\n",
- rev_str, err->apr_err,
- message));
+ if (verr->rev != SVN_INVALID_REVNUM)
+ {
+ rev_str = apr_psprintf(iterpool, "r%ld", verr->rev);
+ rev_str = apr_psprintf(iterpool, "%*s", rev_maxlength, rev_str);
+ for (err = svn_error_purge_tracing(verr->err);
+ err != SVN_NO_ERROR; err = err->child)
+ {
+ char buf[512];
+ const char *message;
+
+ message = svn_err_best_message(err, buf, sizeof(buf));
+ svn_error_clear(svn_stream_printf(feedback_stream, iterpool,
+ "%s: E%06d: %s\n",
+ rev_str, err->apr_err,
+ message));
+ }
}
}
svn_pool_destroy(iterpool);
}
- return svn_error_trace(verify_err);
+ if (verify_baton.error_summary->nelts > 0)
+ {
+ return svn_error_createf(SVN_ERR_CL_REPOS_VERIFY_FAILED, NULL,
+ _("Failed to verify repository '%s'"),
+ svn_dirent_local_style(
+ opt_state->repository_path, pool));
+ }
+
+ return SVN_NO_ERROR;
}
/* This implements `svn_opt_subcommand_t'. */
@@ -1913,7 +2113,7 @@ svn_error_t *
subcommand_hotcopy(apr_getopt_t *os, void *baton, apr_pool_t *pool)
{
struct svnadmin_opt_state *opt_state = baton;
- struct repos_notify_handler_baton notify_baton = { 0 };
+ svn_stream_t *feedback_stream = NULL;
apr_array_header_t *targets;
const char *new_repos_path;
@@ -1924,12 +2124,12 @@ subcommand_hotcopy(apr_getopt_t *os, voi
/* Progress feedback goes to STDOUT, unless they asked to suppress it. */
if (! opt_state->quiet)
- notify_baton.feedback_stream = recode_stream_create(stdout, pool);
+ feedback_stream = recode_stream_create(stdout, pool);
return svn_repos_hotcopy3(opt_state->repository_path, new_repos_path,
opt_state->clean_logs, opt_state->incremental,
!opt_state->quiet ? repos_notify_handler : NULL,
- ¬ify_baton, check_cancel, NULL, pool);
+ feedback_stream, check_cancel, NULL, pool);
}
svn_error_t *
@@ -1940,6 +2140,7 @@ subcommand_info(apr_getopt_t *os, void *
svn_fs_t *fs;
int fs_format;
const char *uuid;
+ svn_revnum_t head_rev;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
@@ -1952,6 +2153,9 @@ subcommand_info(apr_getopt_t *os, void *
SVN_ERR(svn_fs_get_uuid(fs, &uuid, pool));
SVN_ERR(svn_cmdline_printf(pool, _("UUID: %s\n"), uuid));
+
+ SVN_ERR(svn_fs_youngest_rev(&head_rev, fs, pool));
+ SVN_ERR(svn_cmdline_printf(pool, _("Revisions: %ld\n"), head_rev));
{
int repos_format, minor;
svn_version_t *repos_version, *fs_version;
@@ -2313,18 +2517,18 @@ subcommand_upgrade(apr_getopt_t *os, voi
{
svn_error_t *err;
struct svnadmin_opt_state *opt_state = baton;
- struct repos_notify_handler_baton notify_baton = { 0 };
+ svn_stream_t *feedback_stream = NULL;
/* Expect no more arguments. */
SVN_ERR(parse_args(NULL, os, 0, 0, pool));
- SVN_ERR(svn_stream_for_stdout(¬ify_baton.feedback_stream, pool));
+ SVN_ERR(svn_stream_for_stdout(&feedback_stream, pool));
/* Restore default signal handlers. */
setup_cancellation_signals(SIG_DFL);
err = svn_repos_upgrade2(opt_state->repository_path, TRUE,
- repos_notify_handler, ¬ify_baton, pool);
+ repos_notify_handler, feedback_stream, pool);
if (err)
{
if (APR_STATUS_IS_EAGAIN(err->apr_err))
@@ -2342,7 +2546,7 @@ subcommand_upgrade(apr_getopt_t *os, voi
" another process has it open?\n")));
SVN_ERR(svn_cmdline_fflush(stdout));
SVN_ERR(svn_repos_upgrade2(opt_state->repository_path, FALSE,
- repos_notify_handler, ¬ify_baton,
+ repos_notify_handler, feedback_stream,
pool));
}
else if (err->apr_err == SVN_ERR_FS_UNSUPPORTED_UPGRADE)
@@ -2510,6 +2714,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/ra-git/subversion/svnbench/cl.h
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svnbench/cl.h?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svnbench/cl.h (original)
+++ subversion/branches/ra-git/subversion/svnbench/cl.h Mon Nov 30 10:24:16 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/ra-git/subversion/svnbench/null-export-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svnbench/null-export-cmd.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svnbench/null-export-cmd.c (original)
+++ subversion/branches/ra-git/subversion/svnbench/null-export-cmd.c Mon Nov 30 10:24:16 2015
@@ -165,6 +165,15 @@ close_file(void *file_baton,
return SVN_NO_ERROR;
}
+/* Implement svn_write_fn_t, simply counting the incoming data. */
+static svn_error_t *
+file_write_handler(void *baton, const char *data, apr_size_t *len)
+{
+ edit_baton_t *eb = baton;
+ eb->byte_count += *len;
+
+ return SVN_NO_ERROR;
+}
/*** Public Interfaces ***/
@@ -198,6 +207,7 @@ bench_null_export(svn_revnum_t *result_r
svn_client__pathrev_t *loc;
svn_ra_session_t *ra_session;
svn_node_kind_t kind;
+ edit_baton_t *eb = baton;
/* Get the RA connection. */
SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &loc,
@@ -211,6 +221,11 @@ bench_null_export(svn_revnum_t *result_r
{
apr_hash_t *props;
+ /* Since we don't use the editor, we must count "manually". */
+ svn_stream_t *stream = svn_stream_create(eb, pool);
+ svn_stream_set_write(stream, file_write_handler);
+ eb->file_count++;
+
/* Since you cannot actually root an editor at a file, we
* manually drive a few functions of our editor. */
@@ -218,8 +233,7 @@ bench_null_export(svn_revnum_t *result_r
* to the repository. */
/* ### note: the stream will not be closed */
SVN_ERR(svn_ra_get_file(ra_session, "", loc->rev,
- svn_stream_empty(pool),
- NULL, &props, pool));
+ stream, NULL, &props, pool));
}
else if (kind == svn_node_dir)
{
@@ -268,6 +282,10 @@ bench_null_export(svn_revnum_t *result_r
NULL, pool));
SVN_ERR(reporter->finish_report(report_baton, pool));
+
+ /* We don't receive the "add directory" callback for the starting
+ * node. */
+ eb->dir_count++;
}
else if (kind == svn_node_none)
{
Modified: subversion/branches/ra-git/subversion/svnbench/null-list-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svnbench/null-list-cmd.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svnbench/null-list-cmd.c (original)
+++ subversion/branches/ra-git/subversion/svnbench/null-list-cmd.c Mon Nov 30 10:24:16 2015
@@ -48,6 +48,12 @@ struct print_baton {
svn_client_ctx_t *ctx;
};
+/* 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 *
@@ -100,9 +106,9 @@ svn_cl__null_list(apr_getopt_t *os,
svn_opt_push_implicit_dot_target(targets, pool);
if (opt_state->verbose)
- dirent_fields = SVN_DIRENT_ALL;
+ 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/ra-git/subversion/svnbench/null-log-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/svnbench/null-log-cmd.c?rev=1717223&r1=1717222&r2=1717223&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/svnbench/null-log-cmd.c (original)
+++ subversion/branches/ra-git/subversion/svnbench/null-log-cmd.c Mon Nov 30 10:24:16 2015
@@ -198,10 +198,14 @@ svn_cl__null_log(apr_getopt_t *os,
lb.quiet = opt_state->quiet;
revprops = apr_array_make(pool, 3, sizeof(char *));
- APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_AUTHOR;
- APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_DATE;
- if (!opt_state->quiet)
- APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_LOG;
+ if (!opt_state->no_revprops)
+ {
+ APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_AUTHOR;
+ APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_DATE;
+ if (!opt_state->quiet)
+ APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_LOG;
+ }
+
SVN_ERR(svn_client_log5(targets,
&target_peg_revision,
opt_state->revision_ranges,