diff options
Diffstat (limited to 'tools/client-side/svn-bench')
-rw-r--r-- | tools/client-side/svn-bench/cl.h | 198 | ||||
-rw-r--r-- | tools/client-side/svn-bench/client_errors.h | 97 | ||||
-rw-r--r-- | tools/client-side/svn-bench/help-cmd.c | 94 | ||||
-rw-r--r-- | tools/client-side/svn-bench/notify.c | 1045 | ||||
-rw-r--r-- | tools/client-side/svn-bench/null-export-cmd.c | 346 | ||||
-rw-r--r-- | tools/client-side/svn-bench/null-list-cmd.c | 169 | ||||
-rw-r--r-- | tools/client-side/svn-bench/null-log-cmd.c | 243 | ||||
-rw-r--r-- | tools/client-side/svn-bench/svn-bench.c | 954 | ||||
-rw-r--r-- | tools/client-side/svn-bench/util.c | 92 |
9 files changed, 0 insertions, 3238 deletions
diff --git a/tools/client-side/svn-bench/cl.h b/tools/client-side/svn-bench/cl.h deleted file mode 100644 index 7a1e48d..0000000 --- a/tools/client-side/svn-bench/cl.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * cl.h: shared stuff in the command line program - * - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - */ - -/* ==================================================================== */ - - - -#ifndef SVN_CL_H -#define SVN_CL_H - -/*** Includes. ***/ - -#include <apr_tables.h> - -#include "svn_client.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/*** Command dispatch. ***/ - -/* Hold results of option processing that are shared by multiple - commands. */ -typedef struct svn_cl__opt_state_t -{ - /* An array of svn_opt_revision_range_t *'s representing revisions - ranges indicated on the command-line via the -r and -c options. - For each range in the list, if only one revision was provided - (-rN), its 'end' member remains 'svn_opt_revision_unspecified'. - This array always has at least one element, even if that is a - null range in which both ends are 'svn_opt_revision_unspecified'. */ - apr_array_header_t *revision_ranges; - - /* These are simply a copy of the range start and end values present - in the first item of the revision_ranges list. */ - svn_opt_revision_t start_revision; - svn_opt_revision_t end_revision; - - /* Flag which is only set if the '-c' option was used. */ - svn_boolean_t used_change_arg; - - /* Flag which is only set if the '-r' option was used. */ - svn_boolean_t used_revision_arg; - - /* Max number of log messages to get back from svn_client_log2. */ - int limit; - - /* After option processing is done, reflects the switch actually - given on the command line, or svn_depth_unknown if none. */ - svn_depth_t depth; - - svn_boolean_t quiet; /* sssh...avoid unnecessary output */ - svn_boolean_t non_interactive; /* do no interactive prompting */ - svn_boolean_t version; /* print version information */ - svn_boolean_t verbose; /* be verbose */ - svn_boolean_t strict; /* do strictly what was requested */ - const char *encoding; /* the locale/encoding of the data*/ - 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 */ - const char *config_dir; /* over-riding configuration directory */ - apr_array_header_t *config_options; /* over-riding configuration options */ - svn_boolean_t all_revprops; /* retrieve all revprops */ - svn_boolean_t no_revprops; /* retrieve no revprops */ - apr_hash_t *revprop_table; /* table of revision properties to get/set */ - svn_boolean_t use_merge_history; /* use/display extra merge information */ - svn_boolean_t trust_server_cert; /* trust server SSL certs that would - otherwise be rejected as "untrusted" */ -} svn_cl__opt_state_t; - - -typedef struct svn_cl__cmd_baton_t -{ - svn_cl__opt_state_t *opt_state; - svn_client_ctx_t *ctx; -} svn_cl__cmd_baton_t; - - -/* Declare all the command procedures */ -svn_opt_subcommand_t - svn_cl__help, - svn_cl__null_export, - svn_cl__null_list, - svn_cl__null_log; - - -/* See definition in main.c for documentation. */ -extern const svn_opt_subcommand_desc2_t svn_cl__cmd_table[]; - -/* See definition in main.c for documentation. */ -extern const int svn_cl__global_options[]; - -/* See definition in main.c for documentation. */ -extern const apr_getopt_option_t svn_cl__options[]; - - -/* A helper for the many subcommands that wish to merely warn when - * invoked on an unversioned, nonexistent, or otherwise innocuously - * errorful resource. Meant to be wrapped with SVN_ERR(). - * - * If ERR is null, return SVN_NO_ERROR. - * - * Else if ERR->apr_err is one of the error codes supplied in varargs, - * then handle ERR as a warning (unless QUIET is true), clear ERR, and - * return SVN_NO_ERROR, and push the value of ERR->apr_err into the - * ERRORS_SEEN array, if ERRORS_SEEN is not NULL. - * - * Else return ERR. - * - * Typically, error codes like SVN_ERR_UNVERSIONED_RESOURCE, - * SVN_ERR_ENTRY_NOT_FOUND, etc, are supplied in varargs. Don't - * forget to terminate the argument list with SVN_NO_ERROR. - */ -svn_error_t * -svn_cl__try(svn_error_t *err, - apr_array_header_t *errors_seen, - svn_boolean_t quiet, - ...); - - -/* Our cancellation callback. */ -svn_error_t * -svn_cl__check_cancel(void *baton); - - - -/*** Notification functions to display results on the terminal. */ - -/* Set *NOTIFY_FUNC_P and *NOTIFY_BATON_P to a notifier/baton for all - * operations, allocated in POOL. - */ -svn_error_t * -svn_cl__get_notifier(svn_wc_notify_func2_t *notify_func_p, - void **notify_baton_p, - apr_pool_t *pool); - -/* Make the notifier for use with BATON print the appropriate summary - * line at the end of the output. - */ -svn_error_t * -svn_cl__notifier_mark_export(void *baton); - -/* Like svn_client_args_to_target_array() but, if the only error is that some - * arguments are reserved file names, then print warning messages for those - * targets, store the rest of the targets in TARGETS_P and return success. */ -svn_error_t * -svn_cl__args_to_target_array_print_reserved(apr_array_header_t **targets_p, - apr_getopt_t *os, - const apr_array_header_t *known_targets, - svn_client_ctx_t *ctx, - svn_boolean_t keep_dest_origpath_on_truepath_collision, - apr_pool_t *pool); - -/* Return an error if TARGET is a URL; otherwise return SVN_NO_ERROR. */ -svn_error_t * -svn_cl__check_target_is_local_path(const char *target); - -/* Return a copy of PATH, converted to the local path style, skipping - * PARENT_PATH if it is non-null and is a parent of or equal to PATH. - * - * This function assumes PARENT_PATH and PATH are both absolute "dirents" - * or both relative "dirents". */ -const char * -svn_cl__local_style_skip_ancestor(const char *parent_path, - const char *path, - apr_pool_t *pool); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* SVN_CL_H */ diff --git a/tools/client-side/svn-bench/client_errors.h b/tools/client-side/svn-bench/client_errors.h deleted file mode 100644 index 19f0bdf..0000000 --- a/tools/client-side/svn-bench/client_errors.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * client_errors.h: error codes this command line client features - * - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - */ - -/* ==================================================================== */ - - - -#ifndef SVN_CLIENT_ERRORS_H -#define SVN_CLIENT_ERRORS_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* - * This error defining system is copied from and explained in - * ../../include/svn_error_codes.h - */ - -/* Process this file if we're building an error array, or if we have - not defined the enumerated constants yet. */ -#if defined(SVN_ERROR_BUILD_ARRAY) || !defined(SVN_CMDLINE_ERROR_ENUM_DEFINED) - -#if defined(SVN_ERROR_BUILD_ARRAY) - -#error "Need to update err_defn for r1464679 and un-typo 'CDMLINE'" - -#define SVN_ERROR_START \ - static const err_defn error_table[] = { \ - { SVN_ERR_CDMLINE__WARNING, "Warning" }, -#define SVN_ERRDEF(n, s) { n, s }, -#define SVN_ERROR_END { 0, NULL } }; - -#elif !defined(SVN_CMDLINE_ERROR_ENUM_DEFINED) - -#define SVN_ERROR_START \ - typedef enum svn_client_errno_t { \ - SVN_ERR_CDMLINE__WARNING = SVN_ERR_LAST + 1, -#define SVN_ERRDEF(n, s) n, -#define SVN_ERROR_END SVN_ERR_CMDLINE__ERR_LAST } svn_client_errno_t; - -#define SVN_CMDLINE_ERROR_ENUM_DEFINED - -#endif - -/* Define custom command line client error numbers */ - -SVN_ERROR_START - - /* BEGIN Client errors */ - -SVN_ERRDEF(SVN_ERR_CMDLINE__TMPFILE_WRITE, - "Failed writing to temporary file.") - - SVN_ERRDEF(SVN_ERR_CMDLINE__TMPFILE_STAT, - "Failed getting info about temporary file.") - - SVN_ERRDEF(SVN_ERR_CMDLINE__TMPFILE_OPEN, - "Failed opening temporary file.") - - /* END Client errors */ - - -SVN_ERROR_END - -#undef SVN_ERROR_START -#undef SVN_ERRDEF -#undef SVN_ERROR_END - -#endif /* SVN_ERROR_BUILD_ARRAY || !SVN_CMDLINE_ERROR_ENUM_DEFINED */ - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* SVN_CLIENT_ERRORS_H */ diff --git a/tools/client-side/svn-bench/help-cmd.c b/tools/client-side/svn-bench/help-cmd.c deleted file mode 100644 index a3302ec..0000000 --- a/tools/client-side/svn-bench/help-cmd.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * help-cmd.c -- Provide help - * - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - */ - -/* ==================================================================== */ - - - -/*** Includes. ***/ - -#include "svn_string.h" -#include "svn_error.h" -#include "svn_version.h" -#include "cl.h" - -#include "svn_private_config.h" - - -/*** Code. ***/ - -/* This implements the `svn_opt_subcommand_t' interface. */ -svn_error_t * -svn_cl__help(apr_getopt_t *os, - void *baton, - apr_pool_t *pool) -{ - svn_cl__opt_state_t *opt_state; - - /* xgettext: the %s is for SVN_VER_NUMBER. */ - char help_header_template[] = - N_("usage: svn-bench <subcommand> [options] [args]\n" - "Subversion command-line client, version %s.\n" - "Type 'svn-bench help <subcommand>' for help on a specific subcommand.\n" - "Type 'svn-bench --version' to see the program version and RA modules\n" - " or 'svn-bench --version --quiet' to see just the version number.\n" - "\n" - "Most subcommands take file and/or directory arguments, recursing\n" - "on the directories. If no arguments are supplied to such a\n" - "command, it recurses on the current directory (inclusive) by default.\n" - "\n" - "Available subcommands:\n"); - - char help_footer[] = - N_("Subversion is a tool for version control.\n" - "For additional information, see http://subversion.apache.org/\n"); - - char *help_header = - apr_psprintf(pool, _(help_header_template), SVN_VER_NUMBER); - - const char *ra_desc_start - = _("The following repository access (RA) modules are available:\n\n"); - - svn_stringbuf_t *version_footer; - - if (baton) - opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state; - else - opt_state = NULL; - - version_footer = svn_stringbuf_create(ra_desc_start, pool); - SVN_ERR(svn_ra_print_modules(version_footer, pool)); - - return svn_opt_print_help4(os, - "svn-bench", /* ### erm, derive somehow? */ - opt_state ? opt_state->version : FALSE, - opt_state ? opt_state->quiet : FALSE, - opt_state ? opt_state->verbose : FALSE, - version_footer->data, - help_header, /* already gettext()'d */ - svn_cl__cmd_table, - svn_cl__options, - svn_cl__global_options, - _(help_footer), - pool); -} diff --git a/tools/client-side/svn-bench/notify.c b/tools/client-side/svn-bench/notify.c deleted file mode 100644 index 5e19d8a..0000000 --- a/tools/client-side/svn-bench/notify.c +++ /dev/null @@ -1,1045 +0,0 @@ -/* - * notify.c: feedback handlers for cmdline client. - * - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - */ - -/* ==================================================================== */ - - - -/*** Includes. ***/ - -#define APR_WANT_STDIO -#define APR_WANT_STRFUNC -#include <apr_want.h> - -#include "svn_cmdline.h" -#include "svn_pools.h" -#include "svn_dirent_uri.h" -#include "svn_path.h" -#include "svn_sorts.h" -#include "cl.h" - -#include "svn_private_config.h" - - -/* Baton for notify and friends. */ -struct notify_baton -{ - svn_boolean_t received_some_change; - svn_boolean_t is_checkout; - svn_boolean_t is_export; - svn_boolean_t is_wc_to_repos_copy; - svn_boolean_t sent_first_txdelta; - svn_boolean_t in_external; - svn_boolean_t had_print_error; /* Used to not keep printing error messages - when we've already had one print error. */ - - /* Conflict stats for update and merge. */ - unsigned int text_conflicts; - unsigned int prop_conflicts; - unsigned int tree_conflicts; - unsigned int skipped_paths; - apr_hash_t *conflicted_paths; - - /* The cwd, for use in decomposing absolute paths. */ - const char *path_prefix; -}; - - -/* Add a conflicted path to the list of conflicted paths stored - * in the notify baton. */ -static void -add_conflicted_path(struct notify_baton *nb, const char *path) -{ - apr_hash_set(nb->conflicted_paths, - apr_pstrdup(apr_hash_pool_get(nb->conflicted_paths), path), - APR_HASH_KEY_STRING, ""); -} - -/* This implements `svn_wc_notify_func2_t'. - * NOTE: This function can't fail, so we just ignore any print errors. */ -static void -notify(void *baton, const svn_wc_notify_t *n, apr_pool_t *pool) -{ - struct notify_baton *nb = baton; - char statchar_buf[5] = " "; - const char *path_local; - svn_error_t *err; - - if (n->url) - path_local = n->url; - else - { - if (n->path_prefix) - path_local = svn_cl__local_style_skip_ancestor(n->path_prefix, n->path, - pool); - else /* skip nb->path_prefix, if it's non-null */ - path_local = svn_cl__local_style_skip_ancestor(nb->path_prefix, n->path, - pool); - } - - switch (n->action) - { - case svn_wc_notify_skip: - nb->skipped_paths++; - if (n->content_state == svn_wc_notify_state_missing) - { - if ((err = svn_cmdline_printf - (pool, _("Skipped missing target: '%s'\n"), - path_local))) - goto print_error; - } - else if (n->content_state == svn_wc_notify_state_source_missing) - { - if ((err = svn_cmdline_printf - (pool, _("Skipped target: '%s' -- copy-source is missing\n"), - path_local))) - goto print_error; - } - else - { - if ((err = svn_cmdline_printf - (pool, _("Skipped '%s'\n"), path_local))) - goto print_error; - } - break; - case svn_wc_notify_update_skip_obstruction: - nb->skipped_paths++; - if ((err = svn_cmdline_printf( - pool, _("Skipped '%s' -- An obstructing working copy was found\n"), - path_local))) - goto print_error; - break; - case svn_wc_notify_update_skip_working_only: - nb->skipped_paths++; - if ((err = svn_cmdline_printf( - pool, _("Skipped '%s' -- Has no versioned parent\n"), - path_local))) - goto print_error; - break; - case svn_wc_notify_update_skip_access_denied: - nb->skipped_paths++; - if ((err = svn_cmdline_printf( - pool, _("Skipped '%s' -- Access denied\n"), - path_local))) - goto print_error; - break; - case svn_wc_notify_skip_conflicted: - nb->skipped_paths++; - if ((err = svn_cmdline_printf( - pool, _("Skipped '%s' -- Node remains in conflict\n"), - path_local))) - goto print_error; - break; - case svn_wc_notify_update_delete: - case svn_wc_notify_exclude: - nb->received_some_change = TRUE; - if ((err = svn_cmdline_printf(pool, "D %s\n", path_local))) - goto print_error; - break; - case svn_wc_notify_update_broken_lock: - if ((err = svn_cmdline_printf(pool, "B %s\n", path_local))) - goto print_error; - break; - - case svn_wc_notify_update_external_removed: - nb->received_some_change = TRUE; - if (n->err && n->err->message) - { - if ((err = svn_cmdline_printf(pool, "Removed external '%s': %s\n", - path_local, n->err->message))) - goto print_error; - } - else - { - if ((err = svn_cmdline_printf(pool, "Removed external '%s'\n", - path_local))) - goto print_error; - } - break; - - case svn_wc_notify_left_local_modifications: - if ((err = svn_cmdline_printf(pool, "Left local modifications as '%s'\n", - path_local))) - goto print_error; - break; - - case svn_wc_notify_update_replace: - nb->received_some_change = TRUE; - if ((err = svn_cmdline_printf(pool, "R %s\n", path_local))) - goto print_error; - break; - - case svn_wc_notify_update_add: - nb->received_some_change = TRUE; - if (n->content_state == svn_wc_notify_state_conflicted) - { - nb->text_conflicts++; - add_conflicted_path(nb, n->path); - if ((err = svn_cmdline_printf(pool, "C %s\n", path_local))) - goto print_error; - } - else - { - if ((err = svn_cmdline_printf(pool, "A %s\n", path_local))) - goto print_error; - } - break; - - case svn_wc_notify_exists: - nb->received_some_change = TRUE; - if (n->content_state == svn_wc_notify_state_conflicted) - { - nb->text_conflicts++; - add_conflicted_path(nb, n->path); - statchar_buf[0] = 'C'; - } - else - statchar_buf[0] = 'E'; - - if (n->prop_state == svn_wc_notify_state_conflicted) - { - nb->prop_conflicts++; - add_conflicted_path(nb, n->path); - statchar_buf[1] = 'C'; - } - else if (n->prop_state == svn_wc_notify_state_merged) - statchar_buf[1] = 'G'; - - if ((err = svn_cmdline_printf(pool, "%s %s\n", statchar_buf, path_local))) - goto print_error; - break; - - case svn_wc_notify_restore: - if ((err = svn_cmdline_printf(pool, _("Restored '%s'\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_revert: - if ((err = svn_cmdline_printf(pool, _("Reverted '%s'\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_failed_revert: - if (( err = svn_cmdline_printf(pool, _("Failed to revert '%s' -- " - "try updating instead.\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_resolved: - if ((err = svn_cmdline_printf(pool, - _("Resolved conflicted state of '%s'\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_add: - /* We *should* only get the MIME_TYPE if PATH is a file. If we - do get it, and the mime-type is not textual, note that this - is a binary addition. */ - if (n->mime_type && (svn_mime_type_is_binary(n->mime_type))) - { - if ((err = svn_cmdline_printf(pool, "A (bin) %s\n", - path_local))) - goto print_error; - } - else - { - if ((err = svn_cmdline_printf(pool, "A %s\n", - path_local))) - goto print_error; - } - break; - - case svn_wc_notify_delete: - nb->received_some_change = TRUE; - if ((err = svn_cmdline_printf(pool, "D %s\n", - path_local))) - goto print_error; - break; - - case svn_wc_notify_patch: - { - nb->received_some_change = TRUE; - if (n->content_state == svn_wc_notify_state_conflicted) - { - nb->text_conflicts++; - add_conflicted_path(nb, n->path); - statchar_buf[0] = 'C'; - } - else if (n->kind == svn_node_file) - { - if (n->content_state == svn_wc_notify_state_merged) - statchar_buf[0] = 'G'; - else if (n->content_state == svn_wc_notify_state_changed) - statchar_buf[0] = 'U'; - } - - if (n->prop_state == svn_wc_notify_state_conflicted) - { - nb->prop_conflicts++; - add_conflicted_path(nb, n->path); - statchar_buf[1] = 'C'; - } - else if (n->prop_state == svn_wc_notify_state_changed) - statchar_buf[1] = 'U'; - - if (statchar_buf[0] != ' ' || statchar_buf[1] != ' ') - { - if ((err = svn_cmdline_printf(pool, "%s %s\n", - statchar_buf, path_local))) - goto print_error; - } - } - break; - - case svn_wc_notify_patch_applied_hunk: - nb->received_some_change = TRUE; - if (n->hunk_original_start != n->hunk_matched_line) - { - apr_uint64_t off; - const char *s; - const char *minus; - - if (n->hunk_matched_line > n->hunk_original_start) - { - off = n->hunk_matched_line - n->hunk_original_start; - minus = ""; - } - else - { - off = n->hunk_original_start - n->hunk_matched_line; - minus = "-"; - } - - /* ### We're creating the localized strings without - * ### APR_INT64_T_FMT since it isn't translator-friendly */ - if (n->hunk_fuzz) - { - - if (n->prop_name) - { - s = _("> applied hunk ## -%lu,%lu +%lu,%lu ## " - "with offset %s"); - - err = svn_cmdline_printf(pool, - apr_pstrcat(pool, s, - "%"APR_UINT64_T_FMT - " and fuzz %lu (%s)\n", - (char *)NULL), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length, - minus, off, n->hunk_fuzz, - n->prop_name); - } - else - { - s = _("> applied hunk @@ -%lu,%lu +%lu,%lu @@ " - "with offset %s"); - - err = svn_cmdline_printf(pool, - apr_pstrcat(pool, s, - "%"APR_UINT64_T_FMT - " and fuzz %lu\n", - (char *)NULL), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length, - minus, off, n->hunk_fuzz); - } - - if (err) - goto print_error; - } - else - { - - if (n->prop_name) - { - s = _("> applied hunk ## -%lu,%lu +%lu,%lu ## " - "with offset %s"); - err = svn_cmdline_printf(pool, - apr_pstrcat(pool, s, - "%"APR_UINT64_T_FMT" (%s)\n", - (char *)NULL), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length, - minus, off, n->prop_name); - } - else - { - s = _("> applied hunk @@ -%lu,%lu +%lu,%lu @@ " - "with offset %s"); - err = svn_cmdline_printf(pool, - apr_pstrcat(pool, s, - "%"APR_UINT64_T_FMT"\n", - (char *)NULL), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length, - minus, off); - } - - if (err) - goto print_error; - } - } - else if (n->hunk_fuzz) - { - if (n->prop_name) - err = svn_cmdline_printf(pool, - _("> applied hunk ## -%lu,%lu +%lu,%lu ## " - "with fuzz %lu (%s)\n"), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length, - n->hunk_fuzz, - n->prop_name); - else - err = svn_cmdline_printf(pool, - _("> applied hunk @@ -%lu,%lu +%lu,%lu @@ " - "with fuzz %lu\n"), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length, - n->hunk_fuzz); - if (err) - goto print_error; - - } - break; - - case svn_wc_notify_patch_rejected_hunk: - nb->received_some_change = TRUE; - - if (n->prop_name) - err = svn_cmdline_printf(pool, - _("> rejected hunk " - "## -%lu,%lu +%lu,%lu ## (%s)\n"), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length, - n->prop_name); - else - err = svn_cmdline_printf(pool, - _("> rejected hunk " - "@@ -%lu,%lu +%lu,%lu @@\n"), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length); - if (err) - goto print_error; - break; - - case svn_wc_notify_patch_hunk_already_applied: - nb->received_some_change = TRUE; - if (n->prop_name) - err = svn_cmdline_printf(pool, - _("> hunk " - "## -%lu,%lu +%lu,%lu ## " - "already applied (%s)\n"), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length, - n->prop_name); - else - err = svn_cmdline_printf(pool, - _("> hunk " - "@@ -%lu,%lu +%lu,%lu @@ " - "already applied\n"), - n->hunk_original_start, - n->hunk_original_length, - n->hunk_modified_start, - n->hunk_modified_length); - if (err) - goto print_error; - break; - - case svn_wc_notify_update_update: - case svn_wc_notify_merge_record_info: - { - if (n->content_state == svn_wc_notify_state_conflicted) - { - nb->text_conflicts++; - add_conflicted_path(nb, n->path); - statchar_buf[0] = 'C'; - } - else if (n->kind == svn_node_file) - { - if (n->content_state == svn_wc_notify_state_merged) - statchar_buf[0] = 'G'; - else if (n->content_state == svn_wc_notify_state_changed) - statchar_buf[0] = 'U'; - } - - if (n->prop_state == svn_wc_notify_state_conflicted) - { - nb->prop_conflicts++; - add_conflicted_path(nb, n->path); - 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'; - - if (n->lock_state == svn_wc_notify_lock_state_unlocked) - statchar_buf[2] = 'B'; - - if (statchar_buf[0] != ' ' || statchar_buf[1] != ' ') - nb->received_some_change = TRUE; - - if (statchar_buf[0] != ' ' || statchar_buf[1] != ' ' - || statchar_buf[2] != ' ') - { - if ((err = svn_cmdline_printf(pool, "%s %s\n", - statchar_buf, path_local))) - goto print_error; - } - } - break; - - case svn_wc_notify_update_external: - /* Remember that we're now "inside" an externals definition. */ - nb->in_external = TRUE; - - /* Currently this is used for checkouts and switches too. If we - want different output, we'll have to add new actions. */ - if ((err = svn_cmdline_printf(pool, - _("\nFetching external item into '%s':\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_failed_external: - /* If we are currently inside the handling of an externals - definition, then we can simply present n->err as a warning - and feel confident that after this, we aren't handling that - externals definition any longer. */ - if (nb->in_external) - { - svn_handle_warning2(stderr, n->err, "svn: "); - nb->in_external = FALSE; - if ((err = svn_cmdline_printf(pool, "\n"))) - goto print_error; - } - /* Otherwise, we'll just print two warnings. Why? Because - svn_handle_warning2() only shows the single "best message", - but we have two pretty important ones: that the external at - '/some/path' didn't pan out, and then the more specific - reason why (from n->err). */ - else - { - svn_error_t *warn_err = - svn_error_createf(SVN_ERR_BASE, NULL, - _("Error handling externals definition for '%s':"), - path_local); - svn_handle_warning2(stderr, warn_err, "svn: "); - svn_error_clear(warn_err); - svn_handle_warning2(stderr, n->err, "svn: "); - } - break; - - case svn_wc_notify_update_started: - if (! (nb->in_external || - nb->is_checkout || - nb->is_export)) - { - if ((err = svn_cmdline_printf(pool, _("Updating '%s':\n"), - path_local))) - goto print_error; - } - break; - - case svn_wc_notify_update_completed: - { - if (SVN_IS_VALID_REVNUM(n->revision)) - { - if (nb->is_export) - { - if ((err = svn_cmdline_printf - (pool, nb->in_external - ? _("Exported external at revision %ld.\n") - : _("Exported revision %ld.\n"), - n->revision))) - goto print_error; - } - else if (nb->is_checkout) - { - if ((err = svn_cmdline_printf - (pool, nb->in_external - ? _("Checked out external at revision %ld.\n") - : _("Checked out revision %ld.\n"), - n->revision))) - goto print_error; - } - else - { - if (nb->received_some_change) - { - nb->received_some_change = FALSE; - if ((err = svn_cmdline_printf - (pool, nb->in_external - ? _("Updated external to revision %ld.\n") - : _("Updated to revision %ld.\n"), - n->revision))) - goto print_error; - } - else - { - if ((err = svn_cmdline_printf - (pool, nb->in_external - ? _("External at revision %ld.\n") - : _("At revision %ld.\n"), - n->revision))) - goto print_error; - } - } - } - else /* no revision */ - { - if (nb->is_export) - { - if ((err = svn_cmdline_printf - (pool, nb->in_external - ? _("External export complete.\n") - : _("Export complete.\n")))) - goto print_error; - } - else if (nb->is_checkout) - { - if ((err = svn_cmdline_printf - (pool, nb->in_external - ? _("External checkout complete.\n") - : _("Checkout complete.\n")))) - goto print_error; - } - else - { - if ((err = svn_cmdline_printf - (pool, nb->in_external - ? _("External update complete.\n") - : _("Update complete.\n")))) - goto print_error; - } - } - } - - if (nb->in_external) - { - nb->in_external = FALSE; - if ((err = svn_cmdline_printf(pool, "\n"))) - goto print_error; - } - break; - - case svn_wc_notify_status_external: - if ((err = svn_cmdline_printf - (pool, _("\nPerforming status on external item at '%s':\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_status_completed: - if (SVN_IS_VALID_REVNUM(n->revision)) - if ((err = svn_cmdline_printf(pool, - _("Status against revision: %6ld\n"), - n->revision))) - goto print_error; - break; - - case svn_wc_notify_commit_modified: - /* xgettext: Align the %s's on this and the following 4 messages */ - if ((err = svn_cmdline_printf(pool, - nb->is_wc_to_repos_copy - ? _("Sending copy of %s\n") - : _("Sending %s\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_commit_added: - case svn_wc_notify_commit_copied: - if (n->mime_type && svn_mime_type_is_binary(n->mime_type)) - { - if ((err = svn_cmdline_printf(pool, - nb->is_wc_to_repos_copy - ? _("Adding copy of (bin) %s\n") - : _("Adding (bin) %s\n"), - path_local))) - goto print_error; - } - else - { - if ((err = svn_cmdline_printf(pool, - nb->is_wc_to_repos_copy - ? _("Adding copy of %s\n") - : _("Adding %s\n"), - path_local))) - goto print_error; - } - break; - - case svn_wc_notify_commit_deleted: - if ((err = svn_cmdline_printf(pool, - nb->is_wc_to_repos_copy - ? _("Deleting copy of %s\n") - : _("Deleting %s\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_commit_replaced: - case svn_wc_notify_commit_copied_replaced: - if ((err = svn_cmdline_printf(pool, - nb->is_wc_to_repos_copy - ? _("Replacing copy of %s\n") - : _("Replacing %s\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_commit_postfix_txdelta: - if (! nb->sent_first_txdelta) - { - nb->sent_first_txdelta = TRUE; - if ((err = svn_cmdline_printf(pool, - _("Transmitting file data ")))) - goto print_error; - } - - if ((err = svn_cmdline_printf(pool, "."))) - goto print_error; - break; - - case svn_wc_notify_locked: - if ((err = svn_cmdline_printf(pool, _("'%s' locked by user '%s'.\n"), - path_local, n->lock->owner))) - goto print_error; - break; - - case svn_wc_notify_unlocked: - if ((err = svn_cmdline_printf(pool, _("'%s' unlocked.\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_failed_lock: - case svn_wc_notify_failed_unlock: - svn_handle_warning2(stderr, n->err, "svn: "); - break; - - case svn_wc_notify_changelist_set: - if ((err = svn_cmdline_printf(pool, "A [%s] %s\n", - n->changelist_name, path_local))) - goto print_error; - break; - - case svn_wc_notify_changelist_clear: - case svn_wc_notify_changelist_moved: - if ((err = svn_cmdline_printf(pool, - "D [%s] %s\n", - n->changelist_name, path_local))) - goto print_error; - break; - - case svn_wc_notify_merge_begin: - if (n->merge_range == NULL) - err = svn_cmdline_printf(pool, - _("--- Merging differences between " - "repository URLs into '%s':\n"), - path_local); - else if (n->merge_range->start == n->merge_range->end - 1 - || n->merge_range->start == n->merge_range->end) - err = svn_cmdline_printf(pool, _("--- Merging r%ld into '%s':\n"), - n->merge_range->end, path_local); - else if (n->merge_range->start - 1 == n->merge_range->end) - err = svn_cmdline_printf(pool, - _("--- Reverse-merging r%ld into '%s':\n"), - n->merge_range->start, path_local); - else if (n->merge_range->start < n->merge_range->end) - err = svn_cmdline_printf(pool, - _("--- Merging r%ld through r%ld into " - "'%s':\n"), - n->merge_range->start + 1, - n->merge_range->end, path_local); - else /* n->merge_range->start > n->merge_range->end - 1 */ - err = svn_cmdline_printf(pool, - _("--- Reverse-merging r%ld through r%ld " - "into '%s':\n"), - n->merge_range->start, - n->merge_range->end + 1, path_local); - if (err) - goto print_error; - break; - - case svn_wc_notify_merge_record_info_begin: - if (!n->merge_range) - { - err = svn_cmdline_printf(pool, - _("--- Recording mergeinfo for merge " - "between repository URLs into '%s':\n"), - path_local); - } - else - { - if (n->merge_range->start == n->merge_range->end - 1 - || n->merge_range->start == n->merge_range->end) - err = svn_cmdline_printf( - pool, - _("--- Recording mergeinfo for merge of r%ld into '%s':\n"), - n->merge_range->end, path_local); - else if (n->merge_range->start - 1 == n->merge_range->end) - err = svn_cmdline_printf( - pool, - _("--- Recording mergeinfo for reverse merge of r%ld into '%s':\n"), - n->merge_range->start, path_local); - else if (n->merge_range->start < n->merge_range->end) - err = svn_cmdline_printf( - pool, - _("--- Recording mergeinfo for merge of r%ld through r%ld into '%s':\n"), - n->merge_range->start + 1, n->merge_range->end, path_local); - else /* n->merge_range->start > n->merge_range->end - 1 */ - err = svn_cmdline_printf( - pool, - _("--- Recording mergeinfo for reverse merge of r%ld through r%ld into '%s':\n"), - n->merge_range->start, n->merge_range->end + 1, path_local); - } - - if (err) - goto print_error; - break; - - case svn_wc_notify_merge_elide_info: - if ((err = svn_cmdline_printf(pool, - _("--- Eliding mergeinfo from '%s':\n"), - path_local))) - goto print_error; - break; - - case svn_wc_notify_foreign_merge_begin: - if (n->merge_range == NULL) - err = svn_cmdline_printf(pool, - _("--- Merging differences between " - "foreign repository URLs into '%s':\n"), - path_local); - else if (n->merge_range->start == n->merge_range->end - 1 - || n->merge_range->start == n->merge_range->end) - err = svn_cmdline_printf(pool, - _("--- Merging (from foreign repository) " - "r%ld into '%s':\n"), - n->merge_range->end, path_local); - else if (n->merge_range->start - 1 == n->merge_range->end) - err = svn_cmdline_printf(pool, - _("--- Reverse-merging (from foreign " - "repository) r%ld into '%s':\n"), - n->merge_range->start, path_local); - else if (n->merge_range->start < n->merge_range->end) - err = svn_cmdline_printf(pool, - _("--- Merging (from foreign repository) " - "r%ld through r%ld into '%s':\n"), - n->merge_range->start + 1, - n->merge_range->end, path_local); - else /* n->merge_range->start > n->merge_range->end - 1 */ - err = svn_cmdline_printf(pool, - _("--- Reverse-merging (from foreign " - "repository) r%ld through r%ld into " - "'%s':\n"), - n->merge_range->start, - n->merge_range->end + 1, path_local); - if (err) - goto print_error; - break; - - case svn_wc_notify_tree_conflict: - nb->tree_conflicts++; - add_conflicted_path(nb, n->path); - if ((err = svn_cmdline_printf(pool, " C %s\n", path_local))) - goto print_error; - break; - - case svn_wc_notify_update_shadowed_add: - nb->received_some_change = TRUE; - if ((err = svn_cmdline_printf(pool, " A %s\n", path_local))) - goto print_error; - break; - - case svn_wc_notify_update_shadowed_update: - nb->received_some_change = TRUE; - if ((err = svn_cmdline_printf(pool, " U %s\n", path_local))) - goto print_error; - break; - - case svn_wc_notify_update_shadowed_delete: - nb->received_some_change = TRUE; - if ((err = svn_cmdline_printf(pool, " D %s\n", path_local))) - goto print_error; - break; - - case svn_wc_notify_property_modified: - case svn_wc_notify_property_added: - err = svn_cmdline_printf(pool, - _("property '%s' set on '%s'\n"), - n->prop_name, path_local); - if (err) - goto print_error; - break; - - case svn_wc_notify_property_deleted: - err = svn_cmdline_printf(pool, - _("property '%s' deleted from '%s'.\n"), - n->prop_name, path_local); - if (err) - goto print_error; - break; - - case svn_wc_notify_property_deleted_nonexistent: - err = svn_cmdline_printf(pool, - _("Attempting to delete nonexistent " - "property '%s' on '%s'\n"), n->prop_name, - path_local); - if (err) - goto print_error; - break; - - case svn_wc_notify_revprop_set: - err = svn_cmdline_printf(pool, - _("property '%s' set on repository revision %ld\n"), - n->prop_name, n->revision); - if (err) - goto print_error; - break; - - case svn_wc_notify_revprop_deleted: - err = svn_cmdline_printf(pool, - _("property '%s' deleted from repository revision %ld\n"), - n->prop_name, n->revision); - if (err) - goto print_error; - break; - - case svn_wc_notify_upgraded_path: - err = svn_cmdline_printf(pool, _("Upgraded '%s'\n"), path_local); - if (err) - goto print_error; - break; - - case svn_wc_notify_url_redirect: - err = svn_cmdline_printf(pool, _("Redirecting to URL '%s':\n"), - n->url); - if (err) - goto print_error; - break; - - case svn_wc_notify_path_nonexistent: - err = svn_cmdline_printf(pool, _("'%s' is not under version control"), - path_local); - if (err) - goto print_error; - break; - - case svn_wc_notify_conflict_resolver_starting: - /* Once all operations invoke the interactive conflict resolution after - * they've completed, we can run svn_cl__print_conflict_stats() here. */ - break; - - case svn_wc_notify_conflict_resolver_done: - break; - - default: - break; - } - - if ((err = svn_cmdline_fflush(stdout))) - goto print_error; - - return; - - print_error: - /* If we had no errors before, print this error to stderr. Else, don't print - anything. The user already knows there were some output errors, - so there is no point in flooding her with an error per notification. */ - if (!nb->had_print_error) - { - nb->had_print_error = TRUE; - /* Issue #3014: - * Don't print anything on broken pipes. The pipe was likely - * closed by the process at the other end. We expect that - * process to perform error reporting as necessary. - * - * ### This assumes that there is only one error in a chain for - * ### SVN_ERR_IO_PIPE_WRITE_ERROR. See svn_cmdline_fputs(). */ - if (err->apr_err != SVN_ERR_IO_PIPE_WRITE_ERROR) - svn_handle_error2(err, stderr, FALSE, "svn: "); - } - svn_error_clear(err); -} - - -svn_error_t * -svn_cl__get_notifier(svn_wc_notify_func2_t *notify_func_p, - void **notify_baton_p, - apr_pool_t *pool) -{ - struct notify_baton *nb = apr_pcalloc(pool, sizeof(*nb)); - - nb->received_some_change = FALSE; - nb->sent_first_txdelta = FALSE; - nb->is_checkout = FALSE; - nb->is_export = FALSE; - nb->is_wc_to_repos_copy = FALSE; - nb->in_external = FALSE; - nb->had_print_error = FALSE; - nb->text_conflicts = 0; - nb->prop_conflicts = 0; - nb->tree_conflicts = 0; - nb->skipped_paths = 0; - nb->conflicted_paths = apr_hash_make(pool); - SVN_ERR(svn_dirent_get_absolute(&nb->path_prefix, "", pool)); - - *notify_func_p = notify; - *notify_baton_p = nb; - return SVN_NO_ERROR; -} - -svn_error_t * -svn_cl__notifier_mark_export(void *baton) -{ - struct notify_baton *nb = baton; - - nb->is_export = TRUE; - return SVN_NO_ERROR; -} diff --git a/tools/client-side/svn-bench/null-export-cmd.c b/tools/client-side/svn-bench/null-export-cmd.c deleted file mode 100644 index 8220bfb..0000000 --- a/tools/client-side/svn-bench/null-export-cmd.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * export-cmd.c -- Subversion export command - * - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - */ - -/* ==================================================================== */ - - - -/*** Includes. ***/ - -#include "svn_client.h" -#include "svn_error.h" -#include "svn_dirent_uri.h" -#include "svn_path.h" -#include "svn_cmdline.h" -#include "cl.h" - -#include "svn_private_config.h" -#include "private/svn_string_private.h" -#include "private/svn_client_private.h" - -/*** The export editor code. ***/ - -/* ---------------------------------------------------------------------- */ - -/*** A dedicated 'export' editor, which does no .svn/ accounting. ***/ - -typedef struct edit_baton_t -{ - apr_int64_t file_count; - apr_int64_t dir_count; - apr_int64_t byte_count; - apr_int64_t prop_count; - apr_int64_t prop_byte_count; -} edit_baton_t; - -static svn_error_t * -set_target_revision(void *edit_baton, - svn_revnum_t target_revision, - apr_pool_t *pool) -{ - return SVN_NO_ERROR; -} - - -/* Just ensure that the main export directory exists. */ -static svn_error_t * -open_root(void *edit_baton, - svn_revnum_t base_revision, - apr_pool_t *pool, - void **root_baton) -{ - *root_baton = edit_baton; - return SVN_NO_ERROR; -} - - -/* Ensure the directory exists, and send feedback. */ -static svn_error_t * -add_directory(const char *path, - void *parent_baton, - const char *copyfrom_path, - svn_revnum_t copyfrom_revision, - apr_pool_t *pool, - void **baton) -{ - edit_baton_t *eb = parent_baton; - eb->dir_count++; - - *baton = parent_baton; - return SVN_NO_ERROR; -} - - -/* Build a file baton. */ -static svn_error_t * -add_file(const char *path, - void *parent_baton, - const char *copyfrom_path, - svn_revnum_t copyfrom_revision, - apr_pool_t *pool, - void **baton) -{ - edit_baton_t *eb = parent_baton; - eb->file_count++; - - *baton = parent_baton; - return SVN_NO_ERROR; -} - -static svn_error_t * -window_handler(svn_txdelta_window_t *window, void *baton) -{ - edit_baton_t *eb = baton; - if (window != NULL) - eb->byte_count += window->tview_len; - - return SVN_NO_ERROR; -} - -/* Write incoming data into the tmpfile stream */ - -static svn_error_t * -apply_textdelta(void *file_baton, - const char *base_checksum, - apr_pool_t *pool, - svn_txdelta_window_handler_t *handler, - void **handler_baton) -{ - *handler_baton = file_baton; - *handler = window_handler; - - return SVN_NO_ERROR; -} - -static svn_error_t * -change_file_prop(void *file_baton, - const char *name, - const svn_string_t *value, - apr_pool_t *pool) -{ - edit_baton_t *eb = file_baton; - eb->prop_count++; - eb->prop_byte_count += value->len; - - return SVN_NO_ERROR; -} - -static svn_error_t * -change_dir_prop(void *dir_baton, - const char *name, - const svn_string_t *value, - apr_pool_t *pool) -{ - edit_baton_t *eb = dir_baton; - eb->prop_count++; - - return SVN_NO_ERROR; -} - -static svn_error_t * -close_file(void *file_baton, - const char *text_checksum, - apr_pool_t *pool) -{ - return SVN_NO_ERROR; -} - - -/*** Public Interfaces ***/ - -static svn_error_t * -bench_null_export(svn_revnum_t *result_rev, - const char *from_path_or_url, - svn_opt_revision_t *peg_revision, - svn_opt_revision_t *revision, - svn_depth_t depth, - void *baton, - svn_client_ctx_t *ctx, - svn_boolean_t quiet, - apr_pool_t *pool) -{ - svn_revnum_t edit_revision = SVN_INVALID_REVNUM; - svn_boolean_t from_is_url = svn_path_is_url(from_path_or_url); - - SVN_ERR_ASSERT(peg_revision != NULL); - SVN_ERR_ASSERT(revision != NULL); - - if (peg_revision->kind == svn_opt_revision_unspecified) - peg_revision->kind = svn_path_is_url(from_path_or_url) - ? svn_opt_revision_head - : svn_opt_revision_working; - - if (revision->kind == svn_opt_revision_unspecified) - revision = peg_revision; - - if (from_is_url || ! SVN_CLIENT__REVKIND_IS_LOCAL_TO_WC(revision->kind)) - { - svn_client__pathrev_t *loc; - svn_ra_session_t *ra_session; - svn_node_kind_t kind; - - /* Get the RA connection. */ - SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &loc, - from_path_or_url, NULL, - peg_revision, - revision, ctx, pool)); - - SVN_ERR(svn_ra_check_path(ra_session, "", loc->rev, &kind, pool)); - - if (kind == svn_node_file) - { - apr_hash_t *props; - - /* Since you cannot actually root an editor at a file, we - * manually drive a few functions of our editor. */ - - /* Step outside the editor-likeness for a moment, to actually talk - * 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)); - } - else if (kind == svn_node_dir) - { - void *edit_baton = NULL; - const svn_delta_editor_t *export_editor = NULL; - const svn_ra_reporter3_t *reporter; - void *report_baton; - - svn_delta_editor_t *editor = svn_delta_default_editor(pool); - - editor->set_target_revision = set_target_revision; - editor->open_root = open_root; - editor->add_directory = add_directory; - editor->add_file = add_file; - editor->apply_textdelta = apply_textdelta; - editor->close_file = close_file; - editor->change_file_prop = change_file_prop; - editor->change_dir_prop = change_dir_prop; - - /* for ra_svn, we don't need an editior in quiet mode */ - if (!quiet || strncmp(loc->repos_root_url, "svn:", 4)) - SVN_ERR(svn_delta_get_cancellation_editor(ctx->cancel_func, - ctx->cancel_baton, - editor, - baton, - &export_editor, - &edit_baton, - pool)); - - /* Manufacture a basic 'report' to the update reporter. */ - SVN_ERR(svn_ra_do_update3(ra_session, - &reporter, &report_baton, - loc->rev, - "", /* no sub-target */ - depth, - FALSE, /* don't want copyfrom-args */ - FALSE, /* don't want ignore_ancestry */ - export_editor, edit_baton, - pool, pool)); - - SVN_ERR(reporter->set_path(report_baton, "", loc->rev, - /* Depth is irrelevant, as we're - passing start_empty=TRUE anyway. */ - svn_depth_infinity, - TRUE, /* "help, my dir is empty!" */ - NULL, pool)); - - SVN_ERR(reporter->finish_report(report_baton, pool)); - } - else if (kind == svn_node_none) - { - return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL, - _("URL '%s' doesn't exist"), - from_path_or_url); - } - /* kind == svn_node_unknown not handled */ - } - - - if (result_rev) - *result_rev = edit_revision; - - return SVN_NO_ERROR; -} - - -/*** Code. ***/ - -/* This implements the `svn_opt_subcommand_t' interface. */ -svn_error_t * -svn_cl__null_export(apr_getopt_t *os, - void *baton, - apr_pool_t *pool) -{ - 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; - const char *from; - apr_array_header_t *targets; - svn_error_t *err; - svn_opt_revision_t peg_revision; - const char *truefrom; - edit_baton_t eb = { 0 }; - - SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os, - opt_state->targets, - ctx, FALSE, pool)); - - /* We want exactly 1 or 2 targets for this subcommand. */ - if (targets->nelts < 1) - return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0, NULL); - if (targets->nelts > 2) - return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, 0, NULL); - - /* The first target is the `from' path. */ - from = APR_ARRAY_IDX(targets, 0, const char *); - - /* Get the peg revision if present. */ - SVN_ERR(svn_opt_parse_path(&peg_revision, &truefrom, from, pool)); - - if (opt_state->depth == svn_depth_unknown) - opt_state->depth = svn_depth_infinity; - - /* Do the export. */ - err = bench_null_export(NULL, truefrom, &peg_revision, - &(opt_state->start_revision), - opt_state->depth, - &eb, - ctx, opt_state->quiet, pool); - - if (!opt_state->quiet) - SVN_ERR(svn_cmdline_printf(pool, - _("%15s directories\n" - "%15s files\n" - "%15s bytes in files\n" - "%15s properties\n" - "%15s bytes in properties\n"), - svn__ui64toa_sep(eb.dir_count, ',', pool), - svn__ui64toa_sep(eb.file_count, ',', pool), - svn__ui64toa_sep(eb.byte_count, ',', pool), - svn__ui64toa_sep(eb.prop_count, ',', pool), - svn__ui64toa_sep(eb.prop_byte_count, ',', pool))); - - return svn_error_trace(err); -} diff --git a/tools/client-side/svn-bench/null-list-cmd.c b/tools/client-side/svn-bench/null-list-cmd.c deleted file mode 100644 index 8aa08cd..0000000 --- a/tools/client-side/svn-bench/null-list-cmd.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * list-cmd.c -- list a URL - * - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - */ - -#include "svn_cmdline.h" -#include "svn_client.h" -#include "svn_error.h" -#include "svn_pools.h" -#include "svn_time.h" -#include "svn_xml.h" -#include "svn_dirent_uri.h" -#include "svn_path.h" -#include "svn_utf.h" -#include "svn_opt.h" - -#include "cl.h" - -#include "svn_private_config.h" -#include "private/svn_string_private.h" - - - -/* Baton used when printing directory entries. */ -struct print_baton { - svn_boolean_t verbose; - apr_int64_t directories; - apr_int64_t files; - apr_int64_t locks; - svn_client_ctx_t *ctx; -}; - -/* This implements the svn_client_list_func2_t API, printing a single - directory entry in text format. */ -static svn_error_t * -print_dirent(void *baton, - const char *path, - const svn_dirent_t *dirent, - const svn_lock_t *lock, - const char *abs_path, - const char *external_parent_url, - const char *external_target, - apr_pool_t *pool) -{ - struct print_baton *pb = baton; - - if (pb->ctx->cancel_func) - SVN_ERR(pb->ctx->cancel_func(pb->ctx->cancel_baton)); - - if (dirent->kind == svn_node_dir) - pb->directories++; - if (dirent->kind == svn_node_file) - pb->files++; - if (lock) - pb->locks++; - - return SVN_NO_ERROR; -} - - -/* This implements the `svn_opt_subcommand_t' interface. */ -svn_error_t * -svn_cl__null_list(apr_getopt_t *os, - void *baton, - apr_pool_t *pool) -{ - 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; - int i; - apr_pool_t *subpool = svn_pool_create(pool); - apr_uint32_t dirent_fields; - struct print_baton pb = { FALSE }; - svn_boolean_t seen_nonexistent_target = FALSE; - svn_error_t *err; - - SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os, - opt_state->targets, - ctx, FALSE, pool)); - - /* Add "." if user passed 0 arguments */ - svn_opt_push_implicit_dot_target(targets, pool); - - if (opt_state->verbose) - dirent_fields = SVN_DIRENT_ALL; - else - dirent_fields = SVN_DIRENT_KIND; /* the only thing we actually need... */ - - pb.ctx = ctx; - pb.verbose = opt_state->verbose; - - if (opt_state->depth == svn_depth_unknown) - opt_state->depth = svn_depth_immediates; - - /* For each target, try to list it. */ - for (i = 0; i < targets->nelts; i++) - { - const char *target = APR_ARRAY_IDX(targets, i, const char *); - const char *truepath; - svn_opt_revision_t peg_revision; - - svn_pool_clear(subpool); - - SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton)); - - /* Get peg revisions. */ - SVN_ERR(svn_opt_parse_path(&peg_revision, &truepath, target, - subpool)); - - err = svn_client_list3(truepath, &peg_revision, - &(opt_state->start_revision), - opt_state->depth, - dirent_fields, - opt_state->verbose, - FALSE, /* include externals */ - print_dirent, - &pb, ctx, subpool); - - if (err) - { - /* If one of the targets is a non-existent URL or wc-entry, - don't bail out. Just warn and move on to the next target. */ - if (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND || - err->apr_err == SVN_ERR_FS_NOT_FOUND) - svn_handle_warning2(stderr, err, "svn-bench: "); - else - return svn_error_trace(err); - - svn_error_clear(err); - err = NULL; - seen_nonexistent_target = TRUE; - } - else if (!opt_state->quiet) - SVN_ERR(svn_cmdline_printf(pool, - _("%15s directories\n" - "%15s files\n" - "%15s locks\n"), - svn__ui64toa_sep(pb.directories, ',', pool), - svn__ui64toa_sep(pb.files, ',', pool), - svn__ui64toa_sep(pb.locks, ',', pool))); - } - - svn_pool_destroy(subpool); - - if (seen_nonexistent_target) - return svn_error_create( - SVN_ERR_ILLEGAL_TARGET, NULL, - _("Could not list all targets because some targets don't exist")); - else - return SVN_NO_ERROR; -} diff --git a/tools/client-side/svn-bench/null-log-cmd.c b/tools/client-side/svn-bench/null-log-cmd.c deleted file mode 100644 index b35c8f2..0000000 --- a/tools/client-side/svn-bench/null-log-cmd.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * log-cmd.c -- Display log messages - * - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - */ - -#define APR_WANT_STRFUNC -#define APR_WANT_STDIO -#include <apr_want.h> - -#include "svn_cmdline.h" -#include "svn_compat.h" -#include "svn_path.h" -#include "svn_props.h" - -#include "cl.h" - -#include "svn_private_config.h" -#include "private/svn_string_private.h" - - -/*** Code. ***/ - -/* Baton for log_entry_receiver() and log_entry_receiver_xml(). */ -struct log_receiver_baton -{ - /* Client context. */ - svn_client_ctx_t *ctx; - - /* Level of merge revision nesting */ - apr_size_t merge_depth; - - /* collect counters? */ - svn_boolean_t quiet; - - /* total revision counters */ - apr_int64_t revisions; - apr_int64_t changes; - apr_int64_t message_lines; - - /* part that came from merges */ - apr_int64_t merges; - apr_int64_t merged_revs; - apr_int64_t merged_changes; - apr_int64_t merged_message_lines; -}; - - -/* Implement `svn_log_entry_receiver_t', printing the logs in - * a human-readable and machine-parseable format. - * - * BATON is of type `struct log_receiver_baton'. - */ -static svn_error_t * -log_entry_receiver(void *baton, - svn_log_entry_t *log_entry, - apr_pool_t *pool) -{ - struct log_receiver_baton *lb = baton; - const char *author; - const char *date; - const char *message; - - if (lb->ctx->cancel_func) - SVN_ERR(lb->ctx->cancel_func(lb->ctx->cancel_baton)); - - if (! SVN_IS_VALID_REVNUM(log_entry->revision)) - { - lb->merge_depth--; - return SVN_NO_ERROR; - } - - /* if we don't want counters, we are done */ - if (lb->quiet) - return SVN_NO_ERROR; - - /* extract the message and do all the other counting */ - svn_compat_log_revprops_out(&author, &date, &message, log_entry->revprops); - if (log_entry->revision == 0 && message == NULL) - return SVN_NO_ERROR; - - lb->revisions++; - if (lb->merge_depth) - lb->merged_revs++; - - if (message != NULL) - { - int count = svn_cstring_count_newlines(message) + 1; - lb->message_lines += count; - if (lb->merge_depth) - lb->merged_message_lines += count; - } - - if (log_entry->changed_paths2) - { - unsigned count = apr_hash_count(log_entry->changed_paths2); - lb->changes += count; - if (lb->merge_depth) - lb->merged_changes += count; - } - - if (log_entry->has_children) - { - lb->merge_depth++; - lb->merges++; - } - - return SVN_NO_ERROR; -} - -/* This implements the `svn_opt_subcommand_t' interface. */ -svn_error_t * -svn_cl__null_log(apr_getopt_t *os, - void *baton, - apr_pool_t *pool) -{ - 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 log_receiver_baton lb = { 0 }; - const char *target; - int i; - apr_array_header_t *revprops; - svn_opt_revision_t target_peg_revision; - const char *target_path_or_url; - - SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os, - opt_state->targets, - ctx, FALSE, pool)); - - /* Add "." if user passed 0 arguments */ - svn_opt_push_implicit_dot_target(targets, pool); - - /* Determine if they really want a two-revision range. */ - if (opt_state->used_change_arg) - { - if (opt_state->used_revision_arg && opt_state->revision_ranges->nelts > 1) - { - return svn_error_create - (SVN_ERR_CLIENT_BAD_REVISION, NULL, - _("-c and -r are mutually exclusive")); - } - for (i = 0; i < opt_state->revision_ranges->nelts; i++) - { - svn_opt_revision_range_t *range; - range = APR_ARRAY_IDX(opt_state->revision_ranges, i, - svn_opt_revision_range_t *); - if (range->start.value.number < range->end.value.number) - range->start.value.number++; - else - range->end.value.number++; - } - } - - /* Parse the first target into path-or-url and peg revision. */ - target = APR_ARRAY_IDX(targets, 0, const char *); - SVN_ERR(svn_opt_parse_path(&target_peg_revision, &target_path_or_url, - target, pool)); - if (target_peg_revision.kind == svn_opt_revision_unspecified) - target_peg_revision.kind = (svn_path_is_url(target) - ? svn_opt_revision_head - : svn_opt_revision_working); - APR_ARRAY_IDX(targets, 0, const char *) = target_path_or_url; - - if (svn_path_is_url(target)) - { - for (i = 1; i < targets->nelts; i++) - { - target = APR_ARRAY_IDX(targets, i, const char *); - - if (svn_path_is_url(target) || target[0] == '/') - return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("Only relative paths can be specified" - " after a URL for 'svn-bench log', " - "but '%s' is not a relative path"), - target); - } - } - - lb.ctx = ctx; - 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; - SVN_ERR(svn_client_log5(targets, - &target_peg_revision, - opt_state->revision_ranges, - opt_state->limit, - opt_state->verbose, - opt_state->stop_on_copy, - opt_state->use_merge_history, - revprops, - log_entry_receiver, - &lb, - ctx, - pool)); - - if (!opt_state->quiet) - { - if (opt_state->use_merge_history) - SVN_ERR(svn_cmdline_printf(pool, - _("%15s revisions, %15s merged in %s merges\n" - "%15s msg lines, %15s in merged revisions\n" - "%15s changes, %15s in merged revisions\n"), - svn__ui64toa_sep(lb.revisions, ',', pool), - svn__ui64toa_sep(lb.merged_revs, ',', pool), - svn__ui64toa_sep(lb.merges, ',', pool), - svn__ui64toa_sep(lb.message_lines, ',', pool), - svn__ui64toa_sep(lb.merged_message_lines, ',', pool), - svn__ui64toa_sep(lb.changes, ',', pool), - svn__ui64toa_sep(lb.merged_changes, ',', pool))); - else - SVN_ERR(svn_cmdline_printf(pool, - _("%15s revisions\n" - "%15s msg lines\n" - "%15s changes\n"), - svn__ui64toa_sep(lb.revisions, ',', pool), - svn__ui64toa_sep(lb.message_lines, ',', pool), - svn__ui64toa_sep(lb.changes, ',', pool))); - } - - return SVN_NO_ERROR; -} diff --git a/tools/client-side/svn-bench/svn-bench.c b/tools/client-side/svn-bench/svn-bench.c deleted file mode 100644 index bf8964e..0000000 --- a/tools/client-side/svn-bench/svn-bench.c +++ /dev/null @@ -1,954 +0,0 @@ -/* - * main.c: Subversion command line client. - * - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - */ - -/* ==================================================================== */ - - - -/*** Includes. ***/ - -#include <string.h> -#include <assert.h> - -#include <apr_signal.h> - -#include "svn_cmdline.h" -#include "svn_dirent_uri.h" -#include "svn_pools.h" -#include "svn_utf.h" -#include "svn_version.h" - -#include "cl.h" - -#include "private/svn_opt_private.h" -#include "private/svn_cmdline_private.h" - -#include "svn_private_config.h" - - -/*** Option Processing ***/ - -/* Add an identifier here for long options that don't have a short - option. Options that have both long and short options should just - use the short option letter as identifier. */ -typedef enum svn_cl__longopt_t { - opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID, - opt_auth_username, - opt_config_dir, - opt_config_options, - opt_depth, - opt_no_auth_cache, - opt_non_interactive, - opt_stop_on_copy, - opt_strict, - opt_targets, - opt_version, - opt_with_revprop, - opt_with_all_revprops, - opt_with_no_revprops, - opt_trust_server_cert -} svn_cl__longopt_t; - - -/* Option codes and descriptions for the command line client. - * - * The entire list must be terminated with an entry of nulls. - */ -const apr_getopt_option_t svn_cl__options[] = -{ - {"help", 'h', 0, N_("show help on a subcommand")}, - {NULL, '?', 0, N_("show help on a subcommand")}, - {"quiet", 'q', 0, N_("print nothing, or only summary information")}, - {"recursive", 'R', 0, N_("descend recursively, same as --depth=infinity")}, - {"non-recursive", 'N', 0, N_("obsolete; try --depth=files or --depth=immediates")}, - {"change", 'c', 1, - N_("the change made by revision ARG (like -r ARG-1:ARG)\n" - " " - "If ARG is negative this is like -r ARG:ARG-1\n" - " " - "If ARG is of the form ARG1-ARG2 then this is like\n" - " " - "ARG1:ARG2, where ARG1 is inclusive")}, - {"revision", 'r', 1, - N_("ARG (some commands also take ARG1:ARG2 range)\n" - " " - "A revision argument can be one of:\n" - " " - " NUMBER revision number\n" - " " - " '{' DATE '}' revision at start of the date\n" - " " - " 'HEAD' latest in repository\n" - " " - " 'BASE' base rev of item's working copy\n" - " " - " 'COMMITTED' last commit at or before BASE\n" - " " - " 'PREV' revision just before COMMITTED")}, - {"version", opt_version, 0, N_("show program version information")}, - {"verbose", 'v', 0, N_("print extra information")}, - {"username", opt_auth_username, 1, N_("specify a username ARG")}, - {"password", opt_auth_password, 1, N_("specify a password ARG")}, - {"targets", opt_targets, 1, - N_("pass contents of file ARG as additional args")}, - {"depth", opt_depth, 1, - N_("limit operation by depth ARG ('empty', 'files',\n" - " " - "'immediates', or 'infinity')")}, - {"strict", opt_strict, 0, N_("use strict semantics")}, - {"stop-on-copy", opt_stop_on_copy, 0, - N_("do not cross copies while traversing history")}, - {"no-auth-cache", opt_no_auth_cache, 0, - N_("do not cache authentication tokens")}, - {"trust-server-cert", opt_trust_server_cert, 0, - N_("accept SSL server certificates from unknown\n" - " " - "certificate authorities without prompting (but only\n" - " " - "with '--non-interactive')") }, - {"non-interactive", opt_non_interactive, 0, - N_("do no interactive prompting")}, - {"config-dir", opt_config_dir, 1, - N_("read user configuration files from directory ARG")}, - {"config-option", opt_config_options, 1, - N_("set user configuration option in the format:\n" - " " - " FILE:SECTION:OPTION=[VALUE]\n" - " " - "For example:\n" - " " - " servers:global:http-library=serf")}, - {"limit", 'l', 1, N_("maximum number of log entries")}, - {"with-all-revprops", opt_with_all_revprops, 0, - N_("retrieve all revision properties")}, - {"with-no-revprops", opt_with_no_revprops, 0, - N_("retrieve no revision properties")}, - {"with-revprop", opt_with_revprop, 1, - N_("set revision property ARG in new revision\n" - " " - "using the name[=value] format")}, - {"use-merge-history", 'g', 0, - N_("use/display additional information from merge\n" - " " - "history")}, - - /* Long-opt Aliases - * - * These have NULL desriptions, but an option code that matches some - * other option (whose description should probably mention its aliases). - */ - - {0, 0, 0, 0}, -}; - - - -/*** Command dispatch. ***/ - -/* Our array of available subcommands. - * - * The entire list must be terminated with an entry of nulls. - * - * In most of the help text "PATH" is used where a working copy path is - * required, "URL" where a repository URL is required and "TARGET" when - * either a path or a url can be used. Hmm, should this be part of the - * help text? - */ - -/* Options that apply to all commands. (While not every command may - currently require authentication or be interactive, allowing every - command to take these arguments allows scripts to just pass them - 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_config_dir, opt_config_options, 0 -}; - -const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] = -{ - { "help", svn_cl__help, {"?", "h"}, N_ - ("Describe the usage of this program or its subcommands.\n" - "usage: help [SUBCOMMAND...]\n"), - {0} }, - /* This command is also invoked if we see option "--help", "-h" or "-?". */ - - { "null-export", svn_cl__null_export, {0}, N_ - ("Create an unversioned copy of a tree.\n" - "usage: null-export [-r REV] URL[@PEGREV]\n" - "\n" - " Exports a clean directory tree from the repository specified by\n" - " URL, at revision REV if it is given, otherwise at HEAD.\n" - "\n" - " If specified, PEGREV determines in which revision the target is first\n" - " looked up.\n"), - {'r', 'q', 'N', opt_depth} }, - - { "null-list", svn_cl__null_list, {"ls"}, N_ - ("List directory entries in the repository.\n" - "usage: list [TARGET[@REV]...]\n" - "\n" - " List each TARGET file and the contents of each TARGET directory as\n" - " they exist in the repository. If TARGET is a working copy path, the\n" - " corresponding repository URL will be used. If specified, REV determines\n" - " in which revision the target is first looked up.\n" - "\n" - " The default TARGET is '.', meaning the repository URL of the current\n" - " working directory.\n" - "\n" - " With --verbose, the following fields will be fetched for each item:\n" - "\n" - " Revision number of the last commit\n" - " Author of the last commit\n" - " If locked, the letter 'O'. (Use 'svn info URL' to see details)\n" - " Size (in bytes)\n" - " Date and time of the last commit\n"), - {'r', 'v', 'q', 'R', opt_depth} }, - - { "null-log", svn_cl__null_log, {0}, N_ - ("Fetch the log messages for a set of revision(s) and/or path(s).\n" - "usage: 1. null-log [PATH][@REV]\n" - " 2. null-log URL[@REV] [PATH...]\n" - "\n" - " 1. Fetch the log messages for the URL corresponding to PATH\n" - " (default: '.'). If specified, REV is the revision in which the\n" - " URL is first looked up, and the default revision range is REV:1.\n" - " If REV is not specified, the default revision range is BASE:1,\n" - " since the URL might not exist in the HEAD revision.\n" - "\n" - " 2. Fetch the log messages for the PATHs (default: '.') under URL.\n" - " If specified, REV is the revision in which the URL is first\n" - " looked up, and the default revision range is REV:1; otherwise,\n" - " the URL is looked up in HEAD, and the default revision range is\n" - " HEAD:1.\n" - "\n" - " Multiple '-c' or '-r' options may be specified (but not a\n" - " combination of '-c' and '-r' options), and mixing of forward and\n" - " reverse ranges is allowed.\n" - "\n" - " With -v, also print all affected paths with each log message.\n" - " With -q, don't print the log message body itself (note that this is\n" - " compatible with -v).\n" - "\n" - " Each log message is printed just once, even if more than one of the\n" - " affected paths for that revision were explicitly requested. Logs\n" - " 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',}, - {{opt_with_revprop, N_("retrieve revision property ARG")}, - {'c', N_("the change made in revision ARG")}} }, - - { NULL, NULL, {0}, NULL, {0} } -}; - - -/* Version compatibility check */ -static svn_error_t * -check_lib_versions(void) -{ - static const svn_version_checklist_t checklist[] = - { - { "svn_subr", svn_subr_version }, - { "svn_client", svn_client_version }, - { "svn_wc", svn_wc_version }, - { "svn_ra", svn_ra_version }, - { "svn_delta", svn_delta_version }, - { NULL, NULL } - }; - SVN_VERSION_DEFINE(my_version); - - return svn_ver_check_list(&my_version, checklist); -} - - -/* A flag to see if we've been cancelled by the client or not. */ -static volatile sig_atomic_t cancelled = FALSE; - -/* A signal handler to support cancellation. */ -static void -signal_handler(int signum) -{ - apr_signal(signum, SIG_IGN); - cancelled = TRUE; -} - -/* Our cancellation callback. */ -svn_error_t * -svn_cl__check_cancel(void *baton) -{ - if (cancelled) - return svn_error_create(SVN_ERR_CANCELLED, NULL, _("Caught signal")); - else - return SVN_NO_ERROR; -} - - -/*** Main. ***/ - -/* Report and clear the error ERR, and return EXIT_FAILURE. */ -#define EXIT_ERROR(err) \ - svn_cmdline_handle_exit_error(err, NULL, "svn: ") - -/* A redefinition of the public SVN_INT_ERR macro, that suppresses the - * error message if it is SVN_ERR_IO_PIPE_WRITE_ERROR. */ -#undef SVN_INT_ERR -#define SVN_INT_ERR(expr) \ - do { \ - svn_error_t *svn_err__temp = (expr); \ - if (svn_err__temp) \ - return EXIT_ERROR(svn_err__temp); \ - } while (0) - -static int -sub_main(int argc, const char *argv[], apr_pool_t *pool) -{ - svn_error_t *err; - int opt_id; - apr_getopt_t *os; - svn_cl__opt_state_t opt_state = { 0, { 0 } }; - svn_client_ctx_t *ctx; - apr_array_header_t *received_opts; - int i; - const svn_opt_subcommand_desc2_t *subcommand = NULL; - svn_cl__cmd_baton_t command_baton; - svn_auth_baton_t *ab; - svn_config_t *cfg_config; - svn_boolean_t descend = TRUE; - svn_boolean_t use_notifier = TRUE; - - received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int)); - - /* Check library versions */ - SVN_INT_ERR(check_lib_versions()); - -#if defined(WIN32) || defined(__CYGWIN__) - /* Set the working copy administrative directory name. */ - if (getenv("SVN_ASP_DOT_NET_HACK")) - { - SVN_INT_ERR(svn_wc_set_adm_dir("_svn", pool)); - } -#endif - - /* Initialize the RA library. */ - SVN_INT_ERR(svn_ra_initialize(pool)); - - /* Begin processing arguments. */ - opt_state.start_revision.kind = svn_opt_revision_unspecified; - opt_state.end_revision.kind = svn_opt_revision_unspecified; - opt_state.revision_ranges = - apr_array_make(pool, 0, sizeof(svn_opt_revision_range_t *)); - opt_state.depth = svn_depth_unknown; - - /* No args? Show usage. */ - if (argc <= 1) - { - SVN_INT_ERR(svn_cl__help(NULL, NULL, pool)); - return EXIT_FAILURE; - } - - /* Else, parse options. */ - SVN_INT_ERR(svn_cmdline__getopt_init(&os, argc, argv, pool)); - - os->interleave = 1; - while (1) - { - const char *opt_arg; - const char *utf8_opt_arg; - - /* Parse the next option. */ - apr_status_t apr_err = apr_getopt_long(os, svn_cl__options, &opt_id, - &opt_arg); - if (APR_STATUS_IS_EOF(apr_err)) - break; - else if (apr_err) - { - SVN_INT_ERR(svn_cl__help(NULL, NULL, pool)); - return EXIT_FAILURE; - } - - /* Stash the option code in an array before parsing it. */ - APR_ARRAY_PUSH(received_opts, int) = opt_id; - - switch (opt_id) { - case 'l': - { - err = svn_cstring_atoi(&opt_state.limit, opt_arg); - if (err) - { - err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, err, - _("Non-numeric limit argument given")); - return EXIT_ERROR(err); - } - if (opt_state.limit <= 0) - { - err = svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL, - _("Argument to --limit must be positive")); - return EXIT_ERROR(err); - } - } - break; - case 'c': - { - apr_array_header_t *change_revs = - svn_cstring_split(opt_arg, ", \n\r\t\v", TRUE, pool); - - for (i = 0; i < change_revs->nelts; i++) - { - char *end; - svn_revnum_t changeno, changeno_end; - const char *change_str = - APR_ARRAY_IDX(change_revs, i, const char *); - const char *s = change_str; - svn_boolean_t is_negative; - - /* Check for a leading minus to allow "-c -r42". - * The is_negative flag is used to handle "-c -42" and "-c -r42". - * The "-c r-42" case is handled by strtol() returning a - * negative number. */ - is_negative = (*s == '-'); - if (is_negative) - s++; - - /* Allow any number of 'r's to prefix a revision number. */ - while (*s == 'r') - s++; - changeno = changeno_end = strtol(s, &end, 10); - if (end != s && *end == '-') - { - if (changeno < 0 || is_negative) - { - err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, - NULL, - _("Negative number in range (%s)" - " not supported with -c"), - change_str); - return EXIT_ERROR(err); - } - s = end + 1; - while (*s == 'r') - s++; - changeno_end = strtol(s, &end, 10); - } - if (end == change_str || *end != '\0') - { - err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("Non-numeric change argument (%s) " - "given to -c"), change_str); - return EXIT_ERROR(err); - } - - if (changeno == 0) - { - err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("There is no change 0")); - return EXIT_ERROR(err); - } - - if (is_negative) - changeno = -changeno; - - /* Figure out the range: - -c N -> -r N-1:N - -c -N -> -r N:N-1 - -c M-N -> -r M-1:N for M < N - -c M-N -> -r M:N-1 for M > N - -c -M-N -> error (too confusing/no valid use case) - */ - if (changeno > 0) - { - if (changeno <= changeno_end) - changeno--; - else - changeno_end--; - } - else - { - changeno = -changeno; - changeno_end = changeno - 1; - } - - opt_state.used_change_arg = TRUE; - APR_ARRAY_PUSH(opt_state.revision_ranges, - svn_opt_revision_range_t *) - = svn_opt__revision_range_from_revnums(changeno, changeno_end, - pool); - } - } - break; - case 'r': - opt_state.used_revision_arg = TRUE; - if (svn_opt_parse_revision_to_range(opt_state.revision_ranges, - opt_arg, pool) != 0) - { - SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); - err = svn_error_createf - (SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("Syntax error in revision argument '%s'"), - utf8_opt_arg); - return EXIT_ERROR(err); - } - break; - case 'v': - opt_state.verbose = TRUE; - break; - case 'h': - case '?': - opt_state.help = TRUE; - break; - case 'q': - opt_state.quiet = TRUE; - break; - case opt_targets: - { - svn_stringbuf_t *buffer, *buffer_utf8; - - /* We need to convert to UTF-8 now, even before we divide - the targets into an array, because otherwise we wouldn't - know what delimiter to use for svn_cstring_split(). */ - - SVN_INT_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); - SVN_INT_ERR(svn_stringbuf_from_file2(&buffer, utf8_opt_arg, pool)); - SVN_INT_ERR(svn_utf_stringbuf_to_utf8(&buffer_utf8, buffer, pool)); - opt_state.targets = svn_cstring_split(buffer_utf8->data, "\n\r", - TRUE, pool); - } - break; - case 'N': - descend = FALSE; - break; - case opt_depth: - err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool); - if (err) - return EXIT_ERROR - (svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, err, - _("Error converting depth " - "from locale to UTF-8"))); - opt_state.depth = svn_depth_from_word(utf8_opt_arg); - if (opt_state.depth == svn_depth_unknown - || opt_state.depth == svn_depth_exclude) - { - return EXIT_ERROR - (svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("'%s' is not a valid depth; try " - "'empty', 'files', 'immediates', " - "or 'infinity'"), - utf8_opt_arg)); - } - break; - case opt_version: - opt_state.version = TRUE; - break; - case opt_auth_username: - SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_username, - opt_arg, pool)); - break; - case opt_auth_password: - SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password, - opt_arg, pool)); - break; - case opt_stop_on_copy: - opt_state.stop_on_copy = TRUE; - break; - case opt_strict: - opt_state.strict = TRUE; - break; - case opt_no_auth_cache: - opt_state.no_auth_cache = TRUE; - break; - case opt_non_interactive: - opt_state.non_interactive = TRUE; - break; - case opt_trust_server_cert: - opt_state.trust_server_cert = TRUE; - break; - case 'x': - SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_state.extensions, - opt_arg, pool)); - break; - case opt_config_dir: - { - const char *path_utf8; - SVN_INT_ERR(svn_utf_cstring_to_utf8(&path_utf8, opt_arg, pool)); - opt_state.config_dir = svn_dirent_internal_style(path_utf8, pool); - } - break; - case opt_config_options: - if (!opt_state.config_options) - opt_state.config_options = - apr_array_make(pool, 1, - sizeof(svn_cmdline__config_argument_t*)); - - SVN_INT_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool)); - SVN_INT_ERR(svn_cmdline__parse_config_option(opt_state.config_options, - opt_arg, pool)); - break; - case opt_with_all_revprops: - /* If --with-all-revprops is specified along with one or more - * --with-revprops options, --with-all-revprops takes precedence. */ - opt_state.all_revprops = TRUE; - break; - case opt_with_no_revprops: - opt_state.no_revprops = TRUE; - break; - case opt_with_revprop: - SVN_INT_ERR(svn_opt_parse_revprop(&opt_state.revprop_table, - opt_arg, pool)); - break; - case 'g': - opt_state.use_merge_history = TRUE; - break; - default: - /* Hmmm. Perhaps this would be a good place to squirrel away - opts that commands like svn diff might need. Hmmm indeed. */ - break; - } - } - - /* ### This really belongs in libsvn_client. The trouble is, - there's no one place there to run it from, no - svn_client_init(). We'd have to add it to all the public - functions that a client might call. It's unmaintainable to do - initialization from within libsvn_client itself, but it seems - burdensome to demand that all clients call svn_client_init() - before calling any other libsvn_client function... On the other - hand, the alternative is effectively to demand that they call - svn_config_ensure() instead, so maybe we should have a generic - init function anyway. Thoughts? */ - SVN_INT_ERR(svn_config_ensure(opt_state.config_dir, pool)); - - /* If the user asked for help, then the rest of the arguments are - the names of subcommands to get help on (if any), or else they're - just typos/mistakes. Whatever the case, the subcommand to - actually run is svn_cl__help(). */ - if (opt_state.help) - subcommand = svn_opt_get_canonical_subcommand2(svn_cl__cmd_table, "help"); - - /* If we're not running the `help' subcommand, then look for a - subcommand in the first argument. */ - if (subcommand == NULL) - { - if (os->ind >= os->argc) - { - if (opt_state.version) - { - /* Use the "help" subcommand to handle the "--version" option. */ - static const svn_opt_subcommand_desc2_t pseudo_cmd = - { "--version", svn_cl__help, {0}, "", - {opt_version, /* must accept its own option */ - 'q', /* brief output */ - 'v', /* verbose output */ - opt_config_dir /* all commands accept this */ - } }; - - subcommand = &pseudo_cmd; - } - else - { - svn_error_clear - (svn_cmdline_fprintf(stderr, pool, - _("Subcommand argument required\n"))); - SVN_INT_ERR(svn_cl__help(NULL, NULL, pool)); - return EXIT_FAILURE; - } - } - else - { - const char *first_arg = os->argv[os->ind++]; - subcommand = svn_opt_get_canonical_subcommand2(svn_cl__cmd_table, - first_arg); - if (subcommand == NULL) - { - const char *first_arg_utf8; - SVN_INT_ERR(svn_utf_cstring_to_utf8(&first_arg_utf8, - first_arg, pool)); - svn_error_clear - (svn_cmdline_fprintf(stderr, pool, - _("Unknown subcommand: '%s'\n"), - first_arg_utf8)); - SVN_INT_ERR(svn_cl__help(NULL, NULL, pool)); - return EXIT_FAILURE; - } - } - } - - /* Check that the subcommand wasn't passed any inappropriate options. */ - for (i = 0; i < received_opts->nelts; i++) - { - opt_id = APR_ARRAY_IDX(received_opts, i, int); - - /* All commands implicitly accept --help, so just skip over this - when we see it. Note that we don't want to include this option - in their "accepted options" list because it would be awfully - redundant to display it in every commands' help text. */ - if (opt_id == 'h' || opt_id == '?') - continue; - - if (! svn_opt_subcommand_takes_option3(subcommand, opt_id, - svn_cl__global_options)) - { - const char *optstr; - const apr_getopt_option_t *badopt = - svn_opt_get_option_from_code2(opt_id, svn_cl__options, - subcommand, pool); - svn_opt_format_option(&optstr, badopt, FALSE, pool); - if (subcommand->name[0] == '-') - SVN_INT_ERR(svn_cl__help(NULL, NULL, pool)); - else - svn_error_clear - (svn_cmdline_fprintf - (stderr, pool, _("Subcommand '%s' doesn't accept option '%s'\n" - "Type 'svn-bench help %s' for usage.\n"), - subcommand->name, optstr, subcommand->name)); - return EXIT_FAILURE; - } - } - - /* Only merge and log support multiple revisions/revision ranges. */ - if (subcommand->cmd_func != svn_cl__null_log) - { - if (opt_state.revision_ranges->nelts > 1) - { - err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("Multiple revision arguments " - "encountered; can't specify -c twice, " - "or both -c and -r")); - return EXIT_ERROR(err); - } - } - - /* Disallow simultaneous use of both --with-all-revprops and - --with-no-revprops. */ - if (opt_state.all_revprops && opt_state.no_revprops) - { - err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--with-all-revprops and --with-no-revprops " - "are mutually exclusive")); - return EXIT_ERROR(err); - } - - /* Disallow simultaneous use of both --with-revprop and - --with-no-revprops. */ - if (opt_state.revprop_table && opt_state.no_revprops) - { - err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--with-revprop and --with-no-revprops " - "are mutually exclusive")); - return EXIT_ERROR(err); - } - - /* --trust-server-cert can only be used with --non-interactive */ - if (opt_state.trust_server_cert && !opt_state.non_interactive) - { - err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("--trust-server-cert requires " - "--non-interactive")); - return EXIT_ERROR(err); - } - - /* Ensure that 'revision_ranges' has at least one item, and make - 'start_revision' and 'end_revision' match that item. */ - if (opt_state.revision_ranges->nelts == 0) - { - svn_opt_revision_range_t *range = apr_palloc(pool, sizeof(*range)); - range->start.kind = svn_opt_revision_unspecified; - range->end.kind = svn_opt_revision_unspecified; - APR_ARRAY_PUSH(opt_state.revision_ranges, - svn_opt_revision_range_t *) = range; - } - opt_state.start_revision = APR_ARRAY_IDX(opt_state.revision_ranges, 0, - svn_opt_revision_range_t *)->start; - opt_state.end_revision = APR_ARRAY_IDX(opt_state.revision_ranges, 0, - svn_opt_revision_range_t *)->end; - - /* Create a client context object. */ - command_baton.opt_state = &opt_state; - SVN_INT_ERR(svn_client_create_context2(&ctx, NULL, pool)); - command_baton.ctx = ctx; - - /* 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 (opt_state.end_revision.kind != svn_opt_revision_unspecified) - { - err = svn_error_create(SVN_ERR_CLIENT_REVISION_RANGE, NULL, NULL); - return EXIT_ERROR(err); - } - } - - /* -N has a different meaning depending on the command */ - if (!descend) - opt_state.depth = svn_depth_files; - - err = svn_config_get_config(&(ctx->config), - opt_state.config_dir, pool); - if (err) - { - /* Fallback to default config if the config directory isn't readable - or is not a directory. */ - if (APR_STATUS_IS_EACCES(err->apr_err) - || SVN__APR_STATUS_IS_ENOTDIR(err->apr_err)) - { - svn_handle_warning2(stderr, err, "svn: "); - svn_error_clear(err); - } - else - return EXIT_ERROR(err); - } - - cfg_config = apr_hash_get(ctx->config, SVN_CONFIG_CATEGORY_CONFIG, - APR_HASH_KEY_STRING); - - /* Update the options in the config */ - if (opt_state.config_options) - { - svn_error_clear( - svn_cmdline__apply_config_options(ctx->config, - opt_state.config_options, - "svn: ", "--config-option")); - } - - /* Set up the notifier. - - In general, we use it any time we aren't in --quiet mode. 'svn - status' is unique, though, in that we don't want it in --quiet mode - unless we're also in --verbose mode. When in --xml mode, - though, we never want it. */ - if (opt_state.quiet) - use_notifier = FALSE; - if (use_notifier) - { - SVN_INT_ERR(svn_cl__get_notifier(&ctx->notify_func2, &ctx->notify_baton2, - pool)); - } - - /* Set up our cancellation support. */ - ctx->cancel_func = svn_cl__check_cancel; - apr_signal(SIGINT, signal_handler); -#ifdef SIGBREAK - /* SIGBREAK is a Win32 specific signal generated by ctrl-break. */ - apr_signal(SIGBREAK, signal_handler); -#endif -#ifdef SIGHUP - apr_signal(SIGHUP, signal_handler); -#endif -#ifdef SIGTERM - apr_signal(SIGTERM, signal_handler); -#endif - -#ifdef SIGPIPE - /* Disable SIGPIPE generation for the platforms that have it. */ - apr_signal(SIGPIPE, SIG_IGN); -#endif - -#ifdef SIGXFSZ - /* Disable SIGXFSZ generation for the platforms that have it, otherwise - * working with large files when compiled against an APR that doesn't have - * large file support will crash the program, which is uncool. */ - apr_signal(SIGXFSZ, SIG_IGN); -#endif - - /* Set up Authentication stuff. */ - SVN_INT_ERR(svn_cmdline_create_auth_baton(&ab, - opt_state.non_interactive, - opt_state.auth_username, - opt_state.auth_password, - opt_state.config_dir, - opt_state.no_auth_cache, - opt_state.trust_server_cert, - cfg_config, - ctx->cancel_func, - ctx->cancel_baton, - pool)); - - ctx->auth_baton = ab; - - /* The new svn behavior is to postpone everything until after the operation - completed */ - ctx->conflict_func = NULL; - ctx->conflict_baton = NULL; - ctx->conflict_func2 = NULL; - ctx->conflict_baton2 = NULL; - - /* And now we finally run the subcommand. */ - err = (*subcommand->cmd_func)(os, &command_baton, pool); - if (err) - { - /* For argument-related problems, suggest using the 'help' - subcommand. */ - 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-bench help %s' for more information"), - subcommand->name)); - } - if (err->apr_err == SVN_ERR_WC_UPGRADE_REQUIRED) - { - err = svn_error_quick_wrap(err, - _("Please see the 'svn upgrade' command")); - } - - /* Tell the user about 'svn cleanup' if any error on the stack - was about locked working copies. */ - if (svn_error_find_cause(err, SVN_ERR_WC_LOCKED)) - { - err = svn_error_quick_wrap( - err, _("Run 'svn cleanup' to remove locks " - "(type 'svn help cleanup' for details)")); - } - - return EXIT_ERROR(err); - } - else - { - /* Ensure that stdout is flushed, so the user will see any write errors. - This makes sure that output is not silently lost. */ - SVN_INT_ERR(svn_cmdline_fflush(stdout)); - - return EXIT_SUCCESS; - } -} - -int -main(int argc, const char *argv[]) -{ - apr_pool_t *pool; - int exit_code; - - /* Initialize the app. */ - if (svn_cmdline_init("svn", stderr) != EXIT_SUCCESS) - return EXIT_FAILURE; - - /* Create our top-level pool. Use a separate mutexless allocator, - * given this application is single threaded. - */ - pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE)); - - exit_code = sub_main(argc, argv, pool); - - svn_pool_destroy(pool); - return exit_code; -} diff --git a/tools/client-side/svn-bench/util.c b/tools/client-side/svn-bench/util.c deleted file mode 100644 index 2aedde6..0000000 --- a/tools/client-side/svn-bench/util.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * util.c: Subversion command line client utility functions. Any - * functions that need to be shared across subcommands should be put - * in here. - * - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * ==================================================================== - */ - -/* ==================================================================== */ - - - -/*** Includes. ***/ - -#include <string.h> -#include <ctype.h> -#include <assert.h> - -#include "svn_private_config.h" -#include "svn_error.h" -#include "svn_path.h" - -#include "cl.h" - - - -svn_error_t * -svn_cl__args_to_target_array_print_reserved(apr_array_header_t **targets, - apr_getopt_t *os, - const apr_array_header_t *known_targets, - svn_client_ctx_t *ctx, - svn_boolean_t keep_last_origpath_on_truepath_collision, - apr_pool_t *pool) -{ - svn_error_t *err = svn_client_args_to_target_array2(targets, - os, - known_targets, - ctx, - keep_last_origpath_on_truepath_collision, - pool); - if (err) - { - if (err->apr_err == SVN_ERR_RESERVED_FILENAME_SPECIFIED) - { - svn_handle_error2(err, stderr, FALSE, "svn: Skipping argument: "); - svn_error_clear(err); - } - else - return svn_error_trace(err); - } - return SVN_NO_ERROR; -} - -svn_error_t * -svn_cl__check_target_is_local_path(const char *target) -{ - if (svn_path_is_url(target)) - return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, - _("'%s' is not a local path"), target); - return SVN_NO_ERROR; -} - -const char * -svn_cl__local_style_skip_ancestor(const char *parent_path, - const char *path, - apr_pool_t *pool) -{ - const char *relpath = NULL; - - if (parent_path) - relpath = svn_dirent_skip_ancestor(parent_path, path); - - return svn_dirent_local_style(relpath ? relpath : path, pool); -} - |