Modified: subversion/branches/multi-wc-format/subversion/svn/svn.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svn/svn.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svn/svn.c (original) +++ subversion/branches/multi-wc-format/subversion/svn/svn.c Fri Jan 14 14:01:45 2022 @@ -52,6 +52,8 @@ #include "svn_hash.h" #include "svn_version.h" #include "cl.h" +#include "shelf2-cmd.h" +#include "shelf-cmd.h" #include "private/svn_opt_private.h" #include "private/svn_cmdline_private.h" @@ -63,95 +65,6 @@ /*** 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_password_from_stdin, - opt_auth_username, - opt_autoprops, - opt_changelist, - opt_config_dir, - opt_config_options, - /* diff options */ - opt_diff_cmd, - opt_internal_diff, - opt_no_diff_added, - opt_no_diff_deleted, - opt_show_copies_as_adds, - opt_notice_ancestry, - opt_summarize, - opt_use_git_diff_format, - opt_ignore_properties, - opt_properties_only, - opt_patch_compatible, - /* end of diff options */ - opt_dry_run, - opt_editor_cmd, - opt_encoding, - opt_force_log, - opt_force, - opt_keep_changelists, - opt_ignore_ancestry, - opt_ignore_externals, - opt_incremental, - opt_merge_cmd, - opt_native_eol, - opt_new_cmd, - opt_no_auth_cache, - opt_no_autoprops, - opt_no_ignore, - opt_no_unlock, - opt_non_interactive, - opt_force_interactive, - opt_old_cmd, - opt_record_only, - opt_relocate, - opt_remove, - opt_revprop, - opt_stop_on_copy, - opt_strict, /* ### DEPRECATED */ - opt_targets, - opt_depth, - opt_set_depth, - opt_version, - opt_xml, - opt_keep_local, - opt_with_revprop, - opt_with_all_revprops, - opt_with_no_revprops, - opt_parents, - opt_accept, - opt_show_revs, - opt_reintegrate, - opt_trust_server_cert, - opt_trust_server_cert_failures, - opt_strip, - opt_ignore_keywords, - opt_reverse_diff, - opt_ignore_whitespace, - opt_diff, - opt_allow_mixed_revisions, - opt_include_externals, - opt_show_inherited_props, - opt_search, - opt_search_and, - opt_mergeinfo_log, - opt_remove_unversioned, - opt_remove_ignored, - opt_no_newline, - opt_show_passwords, - opt_pin_externals, - opt_show_item, - opt_adds_as_modification, - opt_vacuum_pristines, - opt_drop, - opt_viewspec, - opt_compatible_version -} svn_cl__longopt_t; - - /* Option codes and descriptions for the command line client. * * The entire list must be terminated with an entry of nulls. @@ -167,6 +80,7 @@ const apr_getopt_option_t svn_cl__option {"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")}, + {"human-readable",'H', 0, N_("show human-readable output")}, {"change", 'c', 1, N_("the change made by revision ARG (like -r ARG-1:ARG)\n" " " @@ -421,6 +335,8 @@ const apr_getopt_option_t svn_cl__option {"remove-unversioned", opt_remove_unversioned, 0, N_("remove unversioned items")}, {"remove-ignored", opt_remove_ignored, 0, N_("remove ignored items")}, + {"remove-added", opt_remove_added, 0, + N_("reverting an added item will remove it from disk")}, {"no-newline", opt_no_newline, 0, N_("do not output the trailing newline")}, {"show-passwords", opt_show_passwords, 0, N_("show cached passwords")}, {"pin-externals", opt_pin_externals, 0, @@ -457,7 +373,7 @@ const apr_getopt_option_t svn_cl__option /* Long-opt Aliases * - * These have NULL desriptions, but an option code that matches some + * These have NULL descriptions, but an option code that matches some * other option (whose description should probably mention its aliases). */ @@ -492,15 +408,8 @@ const int svn_cl__global_options[] = opt_config_dir, opt_config_options, 0 }; -/* Options for giving a log message. (Some of these also have other uses.) - */ -#define SVN_CL__LOG_MSG_OPTIONS 'm', 'F', \ - opt_force_log, \ - opt_editor_cmd, \ - opt_encoding, \ - opt_with_revprop - -const svn_opt_subcommand_desc3_t svn_cl__cmd_table[] = +static const svn_opt_subcommand_desc3_t +svn_cl__cmd_table_main[] = { { "add", svn_cl__add, {0}, {N_( "Put new files and directories under version control.\n" @@ -594,7 +503,8 @@ const svn_opt_subcommand_desc3_t svn_cl_ {'r', opt_ignore_keywords} }, { "changelist", svn_cl__changelist, {"cl"}, {N_( - "Associate (or dissociate) changelist CLNAME with the named files.\n" + "Associate (or dissociate) changelist CLNAME with the named\n" + "files.\n" "usage: 1. changelist CLNAME PATH...\n" " 2. changelist --remove PATH...\n" )}, @@ -631,8 +541,8 @@ const svn_opt_subcommand_desc3_t svn_cl_ {{'N', N_("obsolete; same as --depth=files")}} }, { "cleanup", svn_cl__cleanup, {0}, {N_( - "Either recover from an interrupted operation that left the working copy locked,\n" - "or remove unwanted files.\n" + "Either recover from an interrupted operation that left the working\n" + "copy locked, or remove unwanted files.\n" "usage: 1. cleanup [WCPATH...]\n" " 2. cleanup --remove-unversioned [WCPATH...]\n" " cleanup --remove-ignored [WCPATH...]\n" @@ -659,9 +569,9 @@ const svn_opt_subcommand_desc3_t svn_cl_ " referenced by any file in the working copy.\n" )}, { opt_remove_unversioned, opt_remove_ignored, opt_vacuum_pristines, - opt_include_externals, 'q', opt_merge_cmd }, + opt_include_externals, 'q', opt_merge_cmd }, { { opt_merge_cmd, N_("deprecated and ignored") } } }, - + { "commit", svn_cl__commit, {"ci"}, {N_( "Send changes from your working copy to the repository.\n" "usage: commit [PATH...]\n" @@ -791,7 +701,8 @@ const svn_opt_subcommand_desc3_t svn_cl_ "Describe the usage of this program or its subcommands.\n" "usage: help [SUBCOMMAND...]\n" )}, - {0} }, + {'v'}, + {{'v', N_("also show experimental subcommands and options")}} }, /* This command is also invoked if we see option "--help", "-h" or "-?". */ { "import", svn_cl__import, {0}, {N_( @@ -825,10 +736,17 @@ const svn_opt_subcommand_desc3_t svn_cl_ " EXPERIMENTAL:\n" " With --x-viewspec, print the working copy layout.\n" )}, - {'r', 'R', opt_depth, opt_targets, opt_incremental, opt_xml, + {'r', 'R', 'H', opt_depth, opt_targets, opt_incremental, opt_xml, opt_changelist, opt_include_externals, opt_show_item, opt_no_newline, opt_viewspec}, - {{opt_show_item, N_("print only the item identified by ARG:\n" + {{'H', N_("show file sizes with base-2 unit suffixes\n" + " " + "(Byte, Kilobyte, Megabyte, Gigabyte, Terabyte\n" + " " + "and Petabyte), limiting the number of digits\n" + " " + "to three or less")}, + {opt_show_item, N_("print only the item identified by ARG:\n" " " " 'kind' node kind of TARGET\n" " " @@ -844,6 +762,10 @@ const svn_opt_subcommand_desc3_t svn_cl_ " " " 'repos-uuid' UUID of repository\n" " " + " 'repos-size' for files, the size of TARGET\n" + " " + " in the repository\n" + " " " 'revision' specified or implied revision\n" " " " 'last-changed-revision'\n" @@ -870,11 +792,12 @@ const svn_opt_subcommand_desc3_t svn_cl_ " " " 'wc-format-min' oldest supported WC format\n" " " - " 'wc-format-min' newest supported WC format\n")}}, + " 'wc-format-min' newest supported WC format\n" + " " + " 'changelist' changelist of TARGET in WC")}}, }, { "list", svn_cl__list, {"ls"}, -#if defined(WIN32) {N_( "List directory entries in the repository.\n" "usage: list [TARGET[@REV]...]\n" @@ -886,37 +809,22 @@ const svn_opt_subcommand_desc3_t svn_cl_ "\n"), N_( " The default TARGET is '.', meaning the repository URL of the current\n" " working directory.\n" - "\n"), N_( + "\n"), +#if defined(WIN32) + N_( " Multiple --search patterns may be specified and the output will be\n" " reduced to those paths whose last segment - i.e. the file or directory\n" " name - contains a sub-string matching at least one of these patterns\n" " (Windows only).\n" - "\n"), N_( - " With --verbose, the following fields will be shown for each item:\n" - "\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" - )}, + "\n"), #else - {N_( - "List directory entries in the repository.\n" - "usage: list [TARGET[@REV]...]\n" - "\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"), N_( - " The default TARGET is '.', meaning the repository URL of the current\n" - " working directory.\n" - "\n"), N_( + N_( " Multiple --search patterns may be specified and the output will be\n" " reduced to those paths whose last segment - i.e. the file or directory\n" " name - matches at least one of these patterns.\n" - "\n"), N_( + "\n"), +#endif + N_( " With --verbose, the following fields will be shown for each item:\n" "\n"), N_( " Revision number of the last commit\n" @@ -925,9 +833,15 @@ const svn_opt_subcommand_desc3_t svn_cl_ " Size (in bytes)\n" " Date and time of the last commit\n" )}, -#endif - {'r', 'v', 'R', opt_depth, opt_incremental, opt_xml, - opt_include_externals, opt_search}, }, + {'r', 'v', 'R', 'H', opt_depth, opt_incremental, opt_xml, + opt_include_externals, opt_search}, + {{'H', N_("with --verbose, show file sizes with base-2\n" + " " + "unit suffixes (Byte, Kilobyte, Megabyte,\n" + " " + "Gigabyte, Terabyte and Petabyte), limiting\n" + " " + "the number of digits to three or less")}} }, { "lock", svn_cl__lock, {0}, {N_( "Lock working copy paths or URLs in the repository, so that\n" @@ -1777,7 +1691,8 @@ const svn_opt_subcommand_desc3_t svn_cl_ " For information about undoing already committed changes, search\n" " the output of 'svn help merge' for 'undo'.\n" )}, - {opt_targets, 'R', opt_depth, 'q', opt_changelist} }, + {opt_targets, 'R', opt_depth, 'q', opt_changelist, + opt_remove_added} }, { "status", svn_cl__status, {"stat", "st"}, {N_( "Print the status of working copy files and directories.\n" @@ -1878,7 +1793,8 @@ const svn_opt_subcommand_desc3_t svn_cl_ {'N', N_("obsolete; same as --depth=immediates")}} }, { "switch", svn_cl__switch, {"sw"}, {N_( - "Update the working copy to a different URL within the same repository.\n" + "Update the working copy to a different URL within the same\n" + "repository.\n" "usage: 1. switch URL[@PEGREV] [PATH]\n" " 2. switch --relocate FROM-PREFIX TO-PREFIX [PATH...]\n" "\n"), N_( @@ -1914,9 +1830,6 @@ const svn_opt_subcommand_desc3_t svn_cl_ "\n"), N_( " Examples:\n" " svn switch ^/branches/1.x-release\n" - " svn switch --relocate http:// svn://\n" - " svn switch --relocate http://www.example.com/repo/project \\\n" - " svn://svn.example.com/repo/project\n" )}, { 'r', 'N', opt_depth, opt_set_depth, 'q', opt_merge_cmd, opt_ignore_externals, opt_ignore_ancestry, opt_force, opt_accept, @@ -2000,155 +1913,11 @@ const svn_opt_subcommand_desc3_t svn_cl_ )}, { 'q', opt_compatible_version } }, - { "x-shelf-diff", svn_cl__shelf_diff, {0}, {N_( - "Show shelved changes as a diff.\n" - "usage: x-shelf-diff SHELF [VERSION]\n" - "\n"), N_( - " Show the changes in SHELF:VERSION (default: latest) as a diff.\n" - "\n"), N_( - " See also: 'svn diff --cl=svn:shelf:SHELF' which supports most options of\n" - " 'svn diff'.\n" - "\n"), N_( - " The shelving feature is EXPERIMENTAL. This command is likely to change\n" - " in the next release, and there is no promise of backward compatibility.\n" - )}, - {opt_summarize}, - }, - - { "x-shelf-drop", svn_cl__shelf_drop, {0}, {N_( - "Delete a shelf.\n" - "usage: x-shelf-drop SHELF [PATH ...]\n" - "\n"), N_( - " Delete the shelves named SHELF from the working copies containing PATH\n" - " (default PATH is '.')\n" - "\n"), N_( - " The shelving feature is EXPERIMENTAL. This command is likely to change\n" - " in the next release, and there is no promise of backward compatibility.\n" - )}, - }, - - { "x-shelf-list", svn_cl__shelf_list, {"x-shelves"}, {N_( - "List shelves.\n" - "usage: x-shelf-list [PATH ...]\n" - "\n"), N_( - " List shelves for each working copy containing PATH (default is '.')\n" - " Include the first line of any log message and some details about the\n" - " contents of the shelf, unless '-q' is given.\n" - "\n"), N_( - " The shelving feature is EXPERIMENTAL. This command is likely to change\n" - " in the next release, and there is no promise of backward compatibility.\n" - )}, - {'q', 'v'} - }, - - { "x-shelf-list-by-paths", svn_cl__shelf_list_by_paths, {0}, {N_( - "List which shelf affects each path.\n" - "usage: x-shelf-list-by-paths [PATH...]\n" - "\n"), N_( - " List which shelf most recently affects each path below the given PATHs.\n" - "\n"), N_( - " The shelving feature is EXPERIMENTAL. This command is likely to change\n" - " in the next release, and there is no promise of backward compatibility.\n" - )}, - }, - - { "x-shelf-log", svn_cl__shelf_log, {0}, {N_( - "Show the versions of a shelf.\n" - "usage: x-shelf-log SHELF [PATH...]\n" - "\n"), N_( - " Show all versions of SHELF for each working copy containing PATH (the\n" - " default PATH is '.').\n" - "\n"), N_( - " The shelving feature is EXPERIMENTAL. This command is likely to change\n" - " in the next release, and there is no promise of backward compatibility.\n" - )}, - {'q', 'v'} - }, - - { "x-shelf-save", svn_cl__shelf_save, {0}, {N_( - "Copy local changes onto a new version of a shelf.\n" - "usage: x-shelf-save SHELF [PATH...]\n" - "\n"), N_( - " Save local changes in the given PATHs as a new version of SHELF.\n" - " The shelf's log message can be set with -m, -F, etc.\n" - "\n"), N_( - " The same as 'svn shelve --keep-local'.\n" - "\n"), N_( - " The shelving feature is EXPERIMENTAL. This command is likely to change\n" - " in the next release, and there is no promise of backward compatibility.\n" - )}, - {'q', opt_dry_run, - opt_depth, opt_targets, opt_changelist, - SVN_CL__LOG_MSG_OPTIONS, - } - }, - - { "x-shelve", svn_cl__shelf_shelve, {0}, {N_( - "Move local changes onto a shelf.\n" - "usage: x-shelve [--keep-local] SHELF [PATH...]\n" - "\n"), N_( - " Save the local changes in the given PATHs to a new or existing SHELF.\n" - " Revert those changes from the WC unless '--keep-local' is given.\n" - " The shelf's log message can be set with -m, -F, etc.\n" - "\n"), N_( - " 'svn shelve --keep-local' is the same as 'svn shelf-save'.\n" - "\n"), N_( - " The kinds of change you can shelve are committable changes to files and\n" - " properties, except the following kinds which are not yet supported:\n" - " * copies and moves\n" - " * mkdir and rmdir\n" - " Uncommittable states such as conflicts, unversioned and missing cannot\n" - " be shelved.\n" - "\n"), N_( - " To bring back shelved changes, use 'svn unshelve SHELF'.\n" - "\n"), N_( - " Shelves are currently stored under <WC>/.svn/experimental/shelves/ .\n" - " (In Subversion 1.10, shelves were stored under <WC>/.svn/shelves/ as\n" - " patch files. To recover a shelf created by 1.10, either use a 1.10\n" - " client to find and unshelve it, or find the patch file and use any\n" - " 1.10 or later 'svn patch' to apply it.)\n" - "\n"), N_( - " The shelving feature is EXPERIMENTAL. This command is likely to change\n" - " in the next release, and there is no promise of backward compatibility.\n" - )}, - {'q', opt_dry_run, opt_keep_local, - opt_depth, opt_targets, opt_changelist, - SVN_CL__LOG_MSG_OPTIONS, - } }, - - { "x-unshelve", svn_cl__shelf_unshelve, {0}, {N_( - "Copy shelved changes back into the WC.\n" - "usage: x-unshelve [--drop] [SHELF [VERSION]]\n" - "\n"), N_( - " Apply the changes stored in SHELF to the working copy.\n" - " SHELF defaults to the newest shelf.\n" - "\n"), N_( - " Apply the newest version of the shelf, by default. If VERSION is\n" - " specified, apply that version and discard all versions newer than that.\n" - " In any case, retain the unshelved version and versions older than that\n" - " (unless --drop is specified).\n" - "\n"), N_( - " With --drop, delete the entire shelf (like 'svn shelf-drop') after\n" - " successfully unshelving with no conflicts.\n" - "\n"), N_( - " The working files involved should be in a clean, unmodified state\n" - " before using this command. To roll back to an older version of the\n" - " shelf, first ensure any current working changes are removed, such as\n" - " by shelving or reverting them, and then unshelve the desired version.\n" - "\n"), N_( - " Unshelve normally refuses to apply any changes if any path involved is\n" - " already modified (or has any other abnormal status) in the WC. With\n" - " --force, it does not check and may error out and/or produce partial or\n" - " unexpected results.\n" - "\n"), N_( - " The shelving feature is EXPERIMENTAL. This command is likely to change\n" - " in the next release, and there is no promise of backward compatibility.\n" - )}, - {opt_drop, 'q', opt_dry_run, opt_force} }, - { NULL, NULL, {0}, {NULL}, {0} } }; +const svn_opt_subcommand_desc3_t *svn_cl__cmd_table = svn_cl__cmd_table_main; + /* Version compatibility check */ static svn_error_t * @@ -2169,7 +1938,7 @@ check_lib_versions(void) return svn_ver_check_list2(&my_version, checklist, svn_ver_equal); } -/* The cancelation handler setup by the cmdline library. */ +/* The cancellation handler setup by the cmdline library. */ svn_cancel_func_t svn_cl__check_cancel = NULL; /* Add a --search argument to OPT_STATE. @@ -2227,6 +1996,33 @@ viewspec_from_word(enum svn_cl__viewspec return SVN_NO_ERROR; } +/* Re-initialize the command table SVN_CL__CMD_TABLE, + * adding additional commands from CMDS_ADD. + * (TODO: and the options table) */ +static void +add_commands(const svn_opt_subcommand_desc3_t *cmds_add, + apr_pool_t *pool) +{ + int elt_size = sizeof(svn_opt_subcommand_desc3_t); + const svn_opt_subcommand_desc3_t *cmds_old = svn_cl__cmd_table; + const svn_opt_subcommand_desc3_t *cmd; + int n_cmds_old, n_cmds_add, n_cmds_new; + svn_opt_subcommand_desc3_t *cmds_new; + + for (cmd = cmds_old; cmd->name; cmd++) ; + n_cmds_old = (int)(cmd - cmds_old); + for (cmd = cmds_add; cmd->name; cmd++) ; + n_cmds_add = (int)(cmd - cmds_add); + n_cmds_new = n_cmds_old + n_cmds_add; + + /* copy CMDS_OLD and CMDS_ADD, plus an all-zeros terminator entry */ + cmds_new = apr_pcalloc(pool, (n_cmds_new + 1) * elt_size); + memcpy(cmds_new, cmds_old, n_cmds_old * elt_size); + memcpy(&cmds_new[n_cmds_old], cmds_add, n_cmds_add * elt_size); + + svn_cl__cmd_table = cmds_new; +} + static svn_error_t * parse_compatible_version(svn_cl__opt_state_t* opt_state, const char *opt_arg, @@ -2322,6 +2118,7 @@ sub_main(int *exit_code, int argc, const svn_cl__opt_state_t opt_state = { 0, { 0 } }; svn_client_ctx_t *ctx; apr_array_header_t *received_opts; + const char *exp_cmds; int i; const svn_opt_subcommand_desc3_t *subcommand = NULL; const char *dash_F_arg = NULL; @@ -2362,6 +2159,18 @@ sub_main(int *exit_code, int argc, const /* Init the temporary buffer. */ svn_membuf__create(&buf, 0, pool); + /* Add experimental commands, if requested. Use the most recent version + * that we know about and that is mentioned in the env. var. */ + exp_cmds = getenv("SVN_EXPERIMENTAL_COMMANDS"); + if (exp_cmds && strstr(exp_cmds, "shelf3")) + { + add_commands(svn_cl__cmd_table_shelf3, pool); + } + else if (exp_cmds && strstr(exp_cmds, "shelf2")) + { + add_commands(svn_cl__cmd_table_shelf2, pool); + } + /* Begin processing arguments. */ opt_state.start_revision.kind = svn_opt_revision_unspecified; opt_state.end_revision.kind = svn_opt_revision_unspecified; @@ -2371,6 +2180,7 @@ sub_main(int *exit_code, int argc, const opt_state.set_depth = svn_depth_unknown; opt_state.accept_which = svn_cl__accept_unspecified; opt_state.show_revs = svn_cl__show_revs_invalid; + opt_state.file_size_unit = SVN_CL__SIZE_UNIT_NONE; /* No args? Show usage. */ if (argc <= 1) @@ -2586,6 +2396,9 @@ sub_main(int *exit_code, int argc, const case 'N': descend = FALSE; break; + case 'H': + opt_state.file_size_unit = SVN_CL__SIZE_UNIT_BASE_2; + break; case opt_depth: err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool); if (err) @@ -2723,7 +2536,8 @@ sub_main(int *exit_code, int argc, const break; case opt_config_dir: SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool)); - opt_state.config_dir = svn_dirent_internal_style(utf8_opt_arg, pool); + SVN_ERR(svn_dirent_internal_style_safe(&opt_state.config_dir, NULL, + utf8_opt_arg, pool, pool)); break; case opt_config_options: if (!opt_state.config_options) @@ -2892,6 +2706,9 @@ sub_main(int *exit_code, int argc, const case opt_remove_ignored: opt_state.remove_ignored = TRUE; break; + case opt_remove_added: + opt_state.remove_added = TRUE; + break; case opt_no_newline: case opt_strict: /* ### DEPRECATED */ opt_state.no_newline = TRUE; @@ -3291,17 +3108,7 @@ sub_main(int *exit_code, int argc, const sense (unless we've also been instructed not to care). This may access the working copy so do it after setting the locking mode. */ if ((! opt_state.force_log) - && (subcommand->cmd_func == svn_cl__commit - || subcommand->cmd_func == svn_cl__copy - || subcommand->cmd_func == svn_cl__delete - || subcommand->cmd_func == svn_cl__import - || subcommand->cmd_func == svn_cl__mkdir - || subcommand->cmd_func == svn_cl__move - || subcommand->cmd_func == svn_cl__lock - || subcommand->cmd_func == svn_cl__propedit - || subcommand->cmd_func == svn_cl__shelf_save - || subcommand->cmd_func == svn_cl__shelf_shelve - )) + && subcommand->cmd_func != svn_cl__propset) { /* If the -F argument is a file that's under revision control, that's probably not what the user intended. */ @@ -3309,7 +3116,10 @@ sub_main(int *exit_code, int argc, const { svn_node_kind_t kind; const char *local_abspath; - const char *fname = svn_dirent_internal_style(dash_F_arg, pool); + const char *fname; + + SVN_ERR(svn_dirent_internal_style_safe(&fname, NULL, dash_F_arg, + pool, pool)); err = svn_dirent_get_absolute(&local_abspath, fname, pool);
Modified: subversion/branches/multi-wc-format/subversion/svn/util.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svn/util.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svn/util.c (original) +++ subversion/branches/multi-wc-format/subversion/svn/util.c Fri Jan 14 14:01:45 2022 @@ -163,6 +163,8 @@ svn_cl__merge_file_externally(const char arguments[5] = wc_path; arguments[6] = NULL; + /* Presumably apr_filepath_get() returns a valid path, so we don't have + to use the safe version of svn_dirent_internal_style() here. */ SVN_ERR(svn_io_run_cmd(svn_dirent_internal_style(cwd, pool), merge_tool, arguments, &exitcode, NULL, TRUE, NULL, NULL, NULL, pool)); Modified: subversion/branches/multi-wc-format/subversion/svn_private_config.hw URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svn_private_config.hw?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svn_private_config.hw (original) +++ subversion/branches/multi-wc-format/subversion/svn_private_config.hw Fri Jan 14 14:01:45 2022 @@ -39,6 +39,10 @@ #define SVN_BUILD_TARGET "ia64-microsoft-windows" #elif defined( _M_IX86) #define SVN_BUILD_TARGET "x86-microsoft-windows" +#elif defined(_M_ARM64) +#define SVN_BUILD_TARGET "arm64-microsoft-windows" +#elif defined(_M_ARM) +#define SVN_BUILD_TARGET "arm-microsoft-windows" #else #error Unsupported build target. #endif @@ -119,7 +123,7 @@ #define SVN__PREDICT_FALSE(x) (x) /* Macro used to specify that a variable is intentionally left unused. - Supresses compiler warnings about the variable being unused. */ + Suppresses compiler warnings about the variable being unused. */ #define SVN_UNUSED(v) ( (void)(v) ) #if defined(_MSC_VER) && _MSC_VER >= 1600 Modified: subversion/branches/multi-wc-format/subversion/svnadmin/svnadmin.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnadmin/svnadmin.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnadmin/svnadmin.c (original) +++ subversion/branches/multi-wc-format/subversion/svnadmin/svnadmin.c Fri Jan 14 14:01:45 2022 @@ -42,6 +42,7 @@ #include "svn_time.h" #include "svn_user.h" #include "svn_xml.h" +#include "svn_fs.h" #include "private/svn_cmdline_private.h" #include "private/svn_opt_private.h" @@ -49,6 +50,7 @@ #include "private/svn_subr_private.h" #include "private/svn_cmdline_private.h" #include "private/svn_fspath.h" +#include "private/svn_fs_fs_private.h" #include "svn_private_config.h" @@ -95,6 +97,7 @@ check_lib_versions(void) /** Subcommands. **/ static svn_opt_subcommand_t + subcommand_build_repcache, subcommand_crashtest, subcommand_create, subcommand_delrevprop, @@ -114,6 +117,7 @@ static svn_opt_subcommand_t subcommand_lstxns, subcommand_pack, subcommand_recover, + subcommand_rev_size, subcommand_rmlocks, subcommand_rmtxns, subcommand_setlog, @@ -303,6 +307,16 @@ static const apr_getopt_option_t options */ static const svn_opt_subcommand_desc3_t cmd_table[] = { + {"build-repcache", subcommand_build_repcache, {0}, {N_( + "usage: svnadmin build-repcache REPOS_PATH [-r LOWER[:UPPER]]\n" + "\n"), N_( + "Add missing entries to the representation cache for the repository\n" + "at REPOS_PATH. Process data in revisions LOWER through UPPER.\n" + "If no revision arguments are given, process all revisions. If only\n" + "LOWER revision argument is given, process only that single revision.\n" + )}, + {'r', 'q', 'M'} }, + {"crashtest", subcommand_crashtest, {0}, {N_( "usage: svnadmin crashtest REPOS_PATH\n" "\n"), N_( @@ -338,7 +352,8 @@ static const svn_opt_subcommand_desc3_t "2. Delete the property NAME on transaction TXN.\n" )}, {'r', 't', svnadmin__use_pre_revprop_change_hook, - svnadmin__use_post_revprop_change_hook} }, + svnadmin__use_post_revprop_change_hook}, + { {'r', "specify revision number ARG"} } }, {"deltify", subcommand_deltify, {0}, {N_( "usage: svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH\n" @@ -495,7 +510,7 @@ static const svn_opt_subcommand_desc3_t "Print the names of uncommitted transactions. With -rN skip the output\n" "of those that have a base revision more recent than rN. Transactions\n" "with base revisions much older than HEAD are likely to have been\n" - "abandonded and are candidates to be removed.\n" + "abandoned and are candidates to be removed.\n" )}, {'r'}, { {'r', "transaction base revision ARG"} } }, @@ -518,6 +533,18 @@ static const svn_opt_subcommand_desc3_t )}, {svnadmin__wait} }, + {"rev-size", subcommand_rev_size, {0}, {N_( + "usage: svnadmin rev-size REPOS_PATH -r REVISION\n" + "\n"), N_( + "Print the total size in bytes of the representation on disk of\n" + "revision REVISION.\n" + "\n"), N_( + "The size includes revision properties and excludes FSFS indexes.\n" + )}, + {'r', 'q', 'M'}, + { {'r', "specify revision number ARG"}, + {'q', "print only the size and a newline"} }, }, + {"rmlocks", subcommand_rmlocks, {0}, {N_( "usage: svnadmin rmlocks REPOS_PATH LOCKED_PATH...\n" "\n"), N_( @@ -545,7 +572,8 @@ static const svn_opt_subcommand_desc3_t "NOTE: Revision properties are not versioned, so this command will\n" "overwrite the previous log message.\n" )}, - {'r', svnadmin__bypass_hooks} }, + {'r', svnadmin__bypass_hooks}, + { {'r', "specify revision number ARG"} }, }, {"setrevprop", subcommand_setrevprop, {0}, {N_( "usage: 1. svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n" @@ -563,7 +591,8 @@ static const svn_opt_subcommand_desc3_t "2. Set the property NAME on transaction TXN to the contents of FILE.\n" )}, {'r', 't', svnadmin__use_pre_revprop_change_hook, - svnadmin__use_post_revprop_change_hook} }, + svnadmin__use_post_revprop_change_hook}, + { {'r', "specify revision number ARG"} }, }, {"setuuid", subcommand_setuuid, {0}, {N_( "usage: svnadmin setuuid REPOS_PATH [NEW_UUID]\n" @@ -1819,7 +1848,7 @@ subcommand_lstxns(apr_getopt_t *os, void SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); SVN_ERR(get_revnum(&limit, &opt_state->start_revision, youngest, repos, pool)); - + iterpool = svn_pool_create(pool); for (i = 0; i < txns->nelts; i++) { @@ -2847,6 +2876,174 @@ subcommand_delrevprop(apr_getopt_t *os, } +/* Set *REV_SIZE to the total size in bytes of the representation on disk + * of revision REVISION in FS. + * + * This is implemented only for FSFS repositories, and otherwise returns + * an SVN_ERR_UNSUPPORTED_FEATURE error. + * + * The size includes revision properties and excludes FSFS indexes. + */ +static svn_error_t * +revision_size(apr_off_t *rev_size, + svn_fs_t *fs, + svn_revnum_t revision, + apr_pool_t *scratch_pool) +{ + svn_error_t *err; + svn_fs_fs__ioctl_revision_size_input_t input = {0}; + svn_fs_fs__ioctl_revision_size_output_t *output; + + input.revision = revision; + err = svn_fs_ioctl(fs, SVN_FS_FS__IOCTL_REVISION_SIZE, + &input, (void **)&output, + check_cancel, NULL, scratch_pool, scratch_pool); + if (err && err->apr_err == SVN_ERR_FS_UNRECOGNIZED_IOCTL_CODE) + { + return svn_error_quick_wrapf(err, + _("Revision size query is not implemented " + "for the filesystem type found in '%s'"), + svn_fs_path(fs, scratch_pool)); + } + SVN_ERR(err); + + *rev_size = output->rev_size; + return SVN_NO_ERROR; +} + +/* This implements `svn_opt_subcommand_t'. */ +svn_error_t * +subcommand_rev_size(apr_getopt_t *os, void *baton, apr_pool_t *pool) +{ + struct svnadmin_opt_state *opt_state = baton; + svn_revnum_t revision; + apr_off_t rev_size; + svn_repos_t *repos; + + if (opt_state->start_revision.kind != svn_opt_revision_number + || opt_state->end_revision.kind != svn_opt_revision_unspecified) + return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("Invalid revision specifier")); + revision = opt_state->start_revision.value.number; + + SVN_ERR(open_repos(&repos, opt_state->repository_path, opt_state, pool)); + SVN_ERR(revision_size(&rev_size, svn_repos_fs(repos), revision, pool)); + + if (opt_state->quiet) + { + SVN_ERR(svn_cmdline_printf(pool, "%"APR_OFF_T_FMT"\n", rev_size)); + } + else + { + const char *rev_size_str = apr_psprintf(pool, + "%12" APR_OFF_T_FMT, rev_size); + SVN_ERR(svn_cmdline_printf(pool, _("%s bytes in revision %ld\n"), + rev_size_str, revision)); + } + return SVN_NO_ERROR; +} + +static void +build_rep_cache_progress_func(svn_revnum_t revision, + void *baton, + apr_pool_t *pool) +{ + svn_error_clear(svn_cmdline_printf(pool, + _("* Processed revision %ld.\n"), + revision)); +} + +static svn_error_t * +build_rep_cache(svn_fs_t *fs, + svn_revnum_t start_rev, + svn_revnum_t end_rev, + struct svnadmin_opt_state *opt_state, + apr_pool_t *pool) +{ + svn_fs_fs__ioctl_build_rep_cache_input_t input = {0}; + svn_error_t *err; + + input.start_rev = start_rev; + input.end_rev = end_rev; + + if (opt_state->quiet) + { + input.progress_func = NULL; + input.progress_baton = NULL; + } + else + { + input.progress_func = build_rep_cache_progress_func; + input.progress_baton = NULL; + } + + err = svn_fs_ioctl(fs, SVN_FS_FS__IOCTL_BUILD_REP_CACHE, + &input, NULL, + check_cancel, NULL, pool, pool); + if (err && err->apr_err == SVN_ERR_FS_UNRECOGNIZED_IOCTL_CODE) + { + return svn_error_quick_wrapf(err, + _("Building rep-cache is not implemented " + "for the filesystem type found in '%s'"), + svn_fs_path(fs, pool)); + } + else if (err && err->apr_err == SVN_ERR_FS_REP_SHARING_NOT_ALLOWED) + { + svn_error_clear(err); + SVN_ERR(svn_cmdline_printf(pool, + _("svnadmin: Warning - this repository has rep-sharing disabled." + " Building rep-cache has no effect.\n"))); + return SVN_NO_ERROR; + } + else + { + return err; + } +} + +/* This implements `svn_opt_subcommand_t'. */ +static svn_error_t * +subcommand_build_repcache(apr_getopt_t *os, void *baton, apr_pool_t *pool) +{ + struct svnadmin_opt_state *opt_state = baton; + svn_repos_t *repos; + svn_fs_t *fs; + svn_revnum_t youngest; + svn_revnum_t lower; + svn_revnum_t upper; + + /* Expect no more arguments. */ + SVN_ERR(parse_args(NULL, os, 0, 0, pool)); + + SVN_ERR(open_repos(&repos, opt_state->repository_path, opt_state, pool)); + fs = svn_repos_fs(repos); + SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); + + SVN_ERR(get_revnum(&lower, &opt_state->start_revision, + youngest, repos, pool)); + SVN_ERR(get_revnum(&upper, &opt_state->end_revision, + youngest, repos, pool)); + + if (SVN_IS_VALID_REVNUM(lower) && SVN_IS_VALID_REVNUM(upper)) + { + if (lower > upper) + return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, + _("First revision cannot be higher than second")); + } + else if (SVN_IS_VALID_REVNUM(lower)) + { + upper = lower; + } + else + { + upper = youngest; + } + + SVN_ERR(build_rep_cache(fs, lower, upper, opt_state, pool)); + + return SVN_NO_ERROR; +} + /** Main. **/ Modified: subversion/branches/multi-wc-format/subversion/svnbench/null-blame-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnbench/null-blame-cmd.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnbench/null-blame-cmd.c (original) +++ subversion/branches/multi-wc-format/subversion/svnbench/null-blame-cmd.c Fri Jan 14 14:01:45 2022 @@ -58,7 +58,7 @@ delta_handler(svn_txdelta_window_t *wind return SVN_NO_ERROR; } -/* Implementes svn_file_rev_handler_t */ +/* Implements svn_file_rev_handler_t */ static svn_error_t * file_rev_handler(void *baton, const char *path, svn_revnum_t revnum, apr_hash_t *rev_props, Modified: subversion/branches/multi-wc-format/subversion/svnbench/svnbench.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnbench/svnbench.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnbench/svnbench.c (original) +++ subversion/branches/multi-wc-format/subversion/svnbench/svnbench.c Fri Jan 14 14:01:45 2022 @@ -174,7 +174,7 @@ const apr_getopt_option_t svn_cl__option /* Long-opt Aliases * - * These have NULL desriptions, but an option code that matches some + * These have NULL descriptions, but an option code that matches some * other option (whose description should probably mention its aliases). */ Modified: subversion/branches/multi-wc-format/subversion/svndumpfilter/svndumpfilter.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svndumpfilter/svndumpfilter.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svndumpfilter/svndumpfilter.c (original) +++ subversion/branches/multi-wc-format/subversion/svndumpfilter/svndumpfilter.c Fri Jan 14 14:01:45 2022 @@ -43,6 +43,7 @@ #include "svn_mergeinfo.h" #include "svn_version.h" +#include "private/svn_dirent_uri_private.h" #include "private/svn_repos_private.h" #include "private/svn_mergeinfo_private.h" #include "private/svn_cmdline_private.h" @@ -1467,7 +1468,7 @@ sub_main(int *exit_code, int argc, const /* Ensure that each prefix is UTF8-encoded, in internal style, and absolute. */ SVN_ERR(svn_utf_cstring_to_utf8(&prefix, os->argv[i], pool)); - prefix = svn_relpath__internal_style(prefix, pool); + SVN_ERR(svn_relpath__make_internal(&prefix, prefix, pool, pool)); if (prefix[0] != '/') prefix = apr_pstrcat(pool, "/", prefix, SVN_VA_NULL); APR_ARRAY_PUSH(opt_state.prefixes, const char *) = prefix; Propchange: subversion/branches/multi-wc-format/subversion/svnfsfs/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Fri Jan 14 14:01:45 2022 @@ -1 +1,2 @@ svnfsfs +.libs Modified: subversion/branches/multi-wc-format/subversion/svnfsfs/dump-index-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnfsfs/dump-index-cmd.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnfsfs/dump-index-cmd.c (original) +++ subversion/branches/multi-wc-format/subversion/svnfsfs/dump-index-cmd.c Fri Jan 14 14:01:45 2022 @@ -79,6 +79,7 @@ dump_index(const char *path, apr_pool_t *pool) { svn_fs_t *fs; + svn_fs_fs__ioctl_dump_index_input_t input = {0}; /* Check repository type and open it. */ SVN_ERR(open_fs(&fs, path, pool)); @@ -87,8 +88,10 @@ dump_index(const char *path, printf(" Start Length Type Revision Item Checksum\n"); /* Dump the whole index contents */ - SVN_ERR(svn_fs_fs__dump_index(fs, revision, dump_index_entry, NULL, - check_cancel, NULL, pool)); + input.revision = revision; + input.callback_func = dump_index_entry; + SVN_ERR(svn_fs_ioctl(fs, SVN_FS_FS__IOCTL_DUMP_INDEX, &input, NULL, + check_cancel, NULL, pool, pool)); return SVN_NO_ERROR; } Modified: subversion/branches/multi-wc-format/subversion/svnfsfs/load-index-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnfsfs/load-index-cmd.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnfsfs/load-index-cmd.c (original) +++ subversion/branches/multi-wc-format/subversion/svnfsfs/load-index-cmd.c Fri Jan 14 14:01:45 2022 @@ -109,7 +109,7 @@ parse_index_line(svn_fs_fs__p2l_entry_t SVN_ERR(token_to_i64(&value, tokens, 1, 16)); result->size = (apr_off_t)value; - /* Parse the rightmost colum that we care of. */ + /* Parse the rightmost column that we care of. */ SVN_ERR(token_to_i64(&value, tokens, 4, 10)); result->item.number = (apr_uint64_t)value; @@ -135,6 +135,7 @@ load_index(const char *path, svn_revnum_t revision = SVN_INVALID_REVNUM; apr_array_header_t *entries = apr_array_make(pool, 16, sizeof(void*)); apr_pool_t *iterpool = svn_pool_create(pool); + svn_fs_fs__ioctl_load_index_input_t ioctl_input = {0}; /* Check repository type and open it. */ SVN_ERR(open_fs(&fs, path, pool)); @@ -173,7 +174,10 @@ load_index(const char *path, } /* Rewrite the indexes. */ - SVN_ERR(svn_fs_fs__load_index(fs, revision, entries, iterpool)); + ioctl_input.revision = revision; + ioctl_input.entries = entries; + SVN_ERR(svn_fs_ioctl(fs, SVN_FS_FS__IOCTL_LOAD_INDEX, &ioctl_input, NULL, + NULL, NULL, pool, pool)); svn_pool_destroy(iterpool); return SVN_NO_ERROR; Modified: subversion/branches/multi-wc-format/subversion/svnfsfs/stats-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnfsfs/stats-cmd.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnfsfs/stats-cmd.c (original) +++ subversion/branches/multi-wc-format/subversion/svnfsfs/stats-cmd.c Fri Jan 14 14:01:45 2022 @@ -500,15 +500,17 @@ svn_error_t * subcommand__stats(apr_getopt_t *os, void *baton, apr_pool_t *pool) { svnfsfs__opt_state *opt_state = baton; - svn_fs_fs__stats_t *stats; svn_fs_t *fs; + svn_fs_fs__ioctl_get_stats_input_t input = {0}; + svn_fs_fs__ioctl_get_stats_output_t *output; printf("Reading revisions\n"); SVN_ERR(open_fs(&fs, opt_state->repository_path, pool)); - SVN_ERR(svn_fs_fs__get_stats(&stats, fs, print_progress, NULL, - check_cancel, NULL, pool, pool)); - print_stats(stats, pool); + input.progress_func = print_progress; + SVN_ERR(svn_fs_ioctl(fs, SVN_FS_FS__IOCTL_GET_STATS, &input, (void **)&output, + check_cancel, NULL, pool, pool)); + print_stats(output->stats, pool); return SVN_NO_ERROR; } Modified: subversion/branches/multi-wc-format/subversion/svnlook/svnlook.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnlook/svnlook.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnlook/svnlook.c (original) +++ subversion/branches/multi-wc-format/subversion/svnlook/svnlook.c Fri Jan 14 14:01:45 2022 @@ -1323,7 +1323,7 @@ do_log(svnlook_ctxt_t *c, svn_boolean_t return SVN_NO_ERROR; } - /* We immitate what svn_cmdline_printf does here, since we need the byte + /* We imitate what svn_cmdline_printf does here, since we need the byte size of what we are going to print. */ SVN_ERR(svn_subst_translate_cstring2(prop_value->data, &prop_value_eol, Modified: subversion/branches/multi-wc-format/subversion/svnmucc/svnmucc.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnmucc/svnmucc.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnmucc/svnmucc.c (original) +++ subversion/branches/multi-wc-format/subversion/svnmucc/svnmucc.c Fri Jan 14 14:01:45 2022 @@ -632,7 +632,7 @@ sub_main(int *exit_code, int argc, const case config_inline_opt: SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, arg, pool)); SVN_ERR(svn_cmdline__parse_config_option(config_options, opt_arg, - "svnmucc: ", + "svnmucc: ", pool)); break; case no_auth_cache_opt: Modified: subversion/branches/multi-wc-format/subversion/svnrdump/load_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnrdump/load_editor.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnrdump/load_editor.c (original) +++ subversion/branches/multi-wc-format/subversion/svnrdump/load_editor.c Fri Jan 14 14:01:45 2022 @@ -576,7 +576,8 @@ set_revision_property(void *baton, { if (! svn_hash_gets(rb->pb->skip_revprops, name)) svn_hash_sets(rb->revprop_table, - apr_pstrdup(rb->pool, name), value); + apr_pstrdup(rb->pool, name), + svn_string_dup(value, rb->pool)); } else if (rb->head_rev_before_commit == 0 && ! svn_hash_gets(rb->pb->skip_revprops, name)) @@ -591,9 +592,9 @@ set_revision_property(void *baton, /* Remember any datestamp/ author that passes through (see comment in close_revision). */ if (!strcmp(name, SVN_PROP_REVISION_DATE)) - rb->datestamp = value; + rb->datestamp = svn_string_dup(value, rb->pool); if (!strcmp(name, SVN_PROP_REVISION_AUTHOR)) - rb->author = value; + rb->author = svn_string_dup(value, rb->pool); return SVN_NO_ERROR; } @@ -636,7 +637,7 @@ set_node_property(void *baton, prop = apr_palloc(nb->rb->pool, sizeof (*prop)); prop->name = apr_pstrdup(pool, name); - prop->value = value; + prop->value = svn_string_dup(value, pool); svn_hash_sets(nb->prop_changes, prop->name, prop); return SVN_NO_ERROR; @@ -861,16 +862,12 @@ close_revision(void *baton) { if (!svn_hash_gets(rb->pb->skip_revprops, SVN_PROP_REVISION_DATE)) { - SVN_ERR(svn_repos__validate_prop(SVN_PROP_REVISION_DATE, - rb->datestamp, rb->pool)); SVN_ERR(svn_ra_change_rev_prop2(rb->pb->session, committed_rev, SVN_PROP_REVISION_DATE, NULL, rb->datestamp, rb->pool)); } if (!svn_hash_gets(rb->pb->skip_revprops, SVN_PROP_REVISION_AUTHOR)) { - SVN_ERR(svn_repos__validate_prop(SVN_PROP_REVISION_AUTHOR, - rb->author, rb->pool)); SVN_ERR(svn_ra_change_rev_prop2(rb->pb->session, committed_rev, SVN_PROP_REVISION_AUTHOR, NULL, rb->author, rb->pool)); Modified: subversion/branches/multi-wc-format/subversion/svnrdump/svnrdump.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnrdump/svnrdump.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnrdump/svnrdump.c (original) +++ subversion/branches/multi-wc-format/subversion/svnrdump/svnrdump.c Fri Jan 14 14:01:45 2022 @@ -925,7 +925,7 @@ sub_main(int *exit_code, int argc, const SVN_ERR(svn_utf_cstring_to_utf8(&opt_arg, opt_arg, pool)); SVN_ERR(svn_cmdline__parse_config_option(config_options, - opt_arg, + opt_arg, "svnrdump: ", pool)); break; Modified: subversion/branches/multi-wc-format/subversion/svnrdump/util.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnrdump/util.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnrdump/util.c (original) +++ subversion/branches/multi-wc-format/subversion/svnrdump/util.c Fri Jan 14 14:01:45 2022 @@ -46,8 +46,8 @@ svn_rdump__normalize_props(apr_hash_t ** svn_pool_clear(iterpool); SVN_ERR(svn_repos__normalize_prop(&value, NULL, key, value, - result_pool, iterpool)); - svn_hash_sets(*normal_props, key, value); + iterpool, iterpool)); + svn_hash_sets(*normal_props, key, svn_string_dup(value, result_pool)); } svn_pool_destroy(iterpool); Modified: subversion/branches/multi-wc-format/subversion/svnserve/logger.c URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnserve/logger.c?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnserve/logger.c (original) +++ subversion/branches/multi-wc-format/subversion/svnserve/logger.c Fri Jan 14 14:01:45 2022 @@ -88,19 +88,21 @@ logger__create(logger_t **logger, return SVN_NO_ERROR; } -void -logger__log_error(logger_t *logger, - svn_error_t *err, - repository_t *repository, - client_info_t *client_info) +static void +log_message(logger_t *logger, + const svn_error_t *err, + const char *prefix, + repository_t *repository, + client_info_t *client_info) { if (logger && err) { const char *timestr, *continuation; const char *user, *repos, *remote_host; - char errbuf[256]; + /* 8192 from MAX_STRING_LEN in from httpd-2.2.4/include/httpd.h */ - char errstr[8192]; + const apr_size_t errstr_size = 8192; + char *errstr = apr_palloc(logger->pool, errstr_size); svn_error_clear(svn_mutex__lock(logger->mutex)); @@ -118,21 +120,22 @@ logger__log_error(logger_t *logger, continuation = ""; while (err) { + char errbuf[256]; const char *message = svn_err_best_message(err, errbuf, sizeof(errbuf)); /* based on httpd-2.2.4/server/log.c:log_error_core */ - apr_size_t len = apr_snprintf(errstr, sizeof(errstr), + apr_size_t len = apr_snprintf(errstr, errstr_size, "%" APR_PID_T_FMT - " %s %s %s %s ERR%s %s %ld %d ", + " %s %s %s %s %s%s %s %ld %d ", getpid(), timestr, remote_host, user, - repos, continuation, + repos, prefix, continuation, err->file ? err->file : "-", err->line, err->apr_err); len += escape_errorlog_item(errstr + len, message, - sizeof(errstr) - len); + errstr_size - len); /* Truncate for the terminator (as apr_snprintf does) */ - if (len > sizeof(errstr) - sizeof(APR_EOL_STR)) { - len = sizeof(errstr) - sizeof(APR_EOL_STR); + if (len > errstr_size - sizeof(APR_EOL_STR)) { + len = errstr_size - sizeof(APR_EOL_STR); } memcpy(errstr + len, APR_EOL_STR, sizeof(APR_EOL_STR)); @@ -150,6 +153,24 @@ logger__log_error(logger_t *logger, } } +void +logger__log_error(logger_t *logger, + const svn_error_t *err, + repository_t *repository, + client_info_t *client_info) +{ + log_message(logger, err, "ERR", repository, client_info); +} + +void +logger__log_warning(logger_t *logger, + const svn_error_t *err, + repository_t *repository, + client_info_t *client_info) +{ + log_message(logger, err, "WARN", repository, client_info); +} + svn_error_t * logger__write(logger_t *logger, const char *errstr, Modified: subversion/branches/multi-wc-format/subversion/svnserve/logger.h URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/svnserve/logger.h?rev=1897034&r1=1897033&r2=1897034&view=diff ============================================================================== --- subversion/branches/multi-wc-format/subversion/svnserve/logger.h (original) +++ subversion/branches/multi-wc-format/subversion/svnserve/logger.h Fri Jan 14 14:01:45 2022 @@ -64,14 +64,21 @@ logger__write(logger_t *logger, /* Write a description of ERR with additional information from REPOSITORY * and CLIENT_INFO to the log file managed by LOGGER. REPOSITORY as well * as CLIENT_INFO may be NULL. If either ERR or LOGGER are NULL, this - * becomes a no-op. + * becomes a no-op. Does not clear ERR. */ void logger__log_error(logger_t *logger, - svn_error_t *err, + const svn_error_t *err, repository_t *repository, client_info_t *client_info); +/* Like logger__log_error() but for warnings. */ +void +logger__log_warning(logger_t *logger, + const svn_error_t *err, + repository_t *repository, + client_info_t *client_info); + #ifdef __cplusplus } #endif /* __cplusplus */
