svn commit: r1925921 - in /subversion/trunk/subversion/libsvn_subr: opt.c opt_subcommand.c

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <[email protected]>
Author: rinrab
Date: Wed May 28 21:05:56 2025
New Revision: 1925921

URL: http://svn.apache.org/viewvc?rev=1925921&view=rev
Log:
Move subcommand and help related stuff into a separate file, opt_subcommand.c.

Affected symbols:

- svn_opt_get_canonical_subcommand3
- svn_opt_get_option_from_code3
- get_option_from_code3
- format_option
- svn_opt_format_option
- svn_opt_subcommand_takes_option4
- print_command_info3
- print_generic_help_body3
- print_generic_help
- svn_opt_print_generic_help3
- subcommand_help
- svn_opt_subcommand_help4
- svn_opt__print_version_info
- svn_opt_print_help5

* subversion/libsvn_subr/opt.c: Remove those funcs.
* subversion/libsvn_subr/opt_subcommand.c: Copy file from opt.c and keep only
  the funcs listed above. Also cleanup includes and adjust file header.

Added:
    subversion/trunk/subversion/libsvn_subr/opt_subcommand.c
      - copied, changed from r1925920, subversion/trunk/subversion/libsvn_subr/opt.c
Modified:
    subversion/trunk/subversion/libsvn_subr/opt.c

Modified: subversion/trunk/subversion/libsvn_subr/opt.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/opt.c?rev=1925921&r1=1925920&r2=1925921&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/opt.c (original)
+++ subversion/trunk/subversion/libsvn_subr/opt.c Wed May 28 21:05:56 2025
@@ -55,413 +55,6 @@
 
 /*** Code. ***/
 
-const svn_opt_subcommand_desc3_t *
-svn_opt_get_canonical_subcommand3(const svn_opt_subcommand_desc3_t *table,
-                                  const char *cmd_name)
-{
-  int i = 0;
-
-  if (cmd_name == NULL)
-    return NULL;
-
-  while (table[i].name) {
-    int j;
-    if (strcmp(cmd_name, table[i].name) == 0)
-      return table + i;
-    for (j = 0; (j < SVN_OPT_MAX_ALIASES) && table[i].aliases[j]; j++)
-      if (strcmp(cmd_name, table[i].aliases[j]) == 0)
-        return table + i;
-
-    i++;
-  }
-
-  /* If we get here, there was no matching subcommand name or alias. */
-  return NULL;
-}
-
-const apr_getopt_option_t *
-svn_opt_get_option_from_code3(int code,
-                              const apr_getopt_option_t *option_table,
-                              const svn_opt_subcommand_desc3_t *command,
-                              apr_pool_t *pool)
-{
-  apr_size_t i;
-
-  for (i = 0; option_table[i].optch; i++)
-    if (option_table[i].optch == code)
-      {
-        if (command)
-          {
-            int j;
-
-            for (j = 0; ((j < SVN_OPT_MAX_OPTIONS) &&
-                         command->desc_overrides[j].optch); j++)
-              if (command->desc_overrides[j].optch == code)
-                {
-                  apr_getopt_option_t *tmpopt =
-                      apr_palloc(pool, sizeof(*tmpopt));
-                  *tmpopt = option_table[i];
-                  tmpopt->description = command->desc_overrides[j].desc;
-                  return tmpopt;
-                }
-          }
-        return &(option_table[i]);
-      }
-
-  return NULL;
-}
-
-/* Like svn_opt_get_option_from_code3(), but also, if CODE appears a second
- * time in OPTION_TABLE with a different name, then set *LONG_ALIAS to that
- * second name, else set it to NULL. */
-static const apr_getopt_option_t *
-get_option_from_code3(const char **long_alias,
-                      int code,
-                      const apr_getopt_option_t *option_table,
-                      const svn_opt_subcommand_desc3_t *command,
-                      apr_pool_t *pool)
-{
-  const apr_getopt_option_t *i;
-  const apr_getopt_option_t *opt
-    = svn_opt_get_option_from_code3(code, option_table, command, pool);
-
-  /* Find a long alias in the table, if there is one. */
-  *long_alias = NULL;
-  for (i = option_table; i->optch; i++)
-    {
-      if (i->optch == code && i->name != opt->name)
-        {
-          *long_alias = i->name;
-          break;
-        }
-    }
-
-  return opt;
-}
-
-
-/* Print an option OPT nicely into a STRING allocated in POOL.
- * If OPT has a single-character short form, then print OPT->name (if not
- * NULL) as an alias, else print LONG_ALIAS (if not NULL) as an alias.
- * If DOC is set, include the generic documentation string of OPT,
- * localized to the current locale if a translation is available.
- */
-static void
-format_option(const char **string,
-              const apr_getopt_option_t *opt,
-              const char *long_alias,
-              svn_boolean_t doc,
-              apr_pool_t *pool)
-{
-  char *opts;
-
-  if (opt == NULL)
-    {
-      *string = "?";
-      return;
-    }
-
-  /* We have a valid option which may or may not have a "short
-     name" (a single-character alias for the long option). */
-  if (opt->optch <= 255)
-    opts = apr_psprintf(pool, "-%c [--%s]", opt->optch, opt->name);
-  else if (long_alias)
-    opts = apr_psprintf(pool, "--%s [--%s]", opt->name, long_alias);
-  else
-    opts = apr_psprintf(pool, "--%s", opt->name);
-
-  if (opt->has_arg)
-    opts = apr_pstrcat(pool, opts, _(" ARG"), SVN_VA_NULL);
-
-  if (doc)
-    opts = apr_psprintf(pool, "%-24s : %s", opts, _(opt->description));
-
-  *string = opts;
-}
-
-void
-svn_opt_format_option(const char **string,
-                      const apr_getopt_option_t *opt,
-                      svn_boolean_t doc,
-                      apr_pool_t *pool)
-{
-  format_option(string, opt, NULL, doc, pool);
-}
-
-
-svn_boolean_t
-svn_opt_subcommand_takes_option4(const svn_opt_subcommand_desc3_t *command,
-                                 int option_code,
-                                 const int *global_options)
-{
-  apr_size_t i;
-
-  for (i = 0; i < SVN_OPT_MAX_OPTIONS; i++)
-    if (command->valid_options[i] == option_code)
-      return TRUE;
-
-  if (global_options)
-    for (i = 0; global_options[i]; i++)
-      if (global_options[i] == option_code)
-        return TRUE;
-
-  return FALSE;
-}
-
-
-/* Print the canonical command name for CMD, and all its aliases, to
-   STREAM.  If HELP is set, print CMD's help string too, in which case
-   obtain option usage from OPTIONS_TABLE.
-
-   Include global and experimental options iff VERBOSE is true.
- */
-static svn_error_t *
-print_command_info3(const svn_opt_subcommand_desc3_t *cmd,
-                    const apr_getopt_option_t *options_table,
-                    const int *global_options,
-                    svn_boolean_t help,
-                    svn_boolean_t verbose,
-                    apr_pool_t *pool,
-                    FILE *stream)
-{
-  svn_boolean_t first_time;
-  apr_size_t i;
-
-  /* Print the canonical command name. */
-  SVN_ERR(svn_cmdline_fputs(cmd->name, stream, pool));
-
-  /* Print the list of aliases. */
-  first_time = TRUE;
-  for (i = 0; i < SVN_OPT_MAX_ALIASES; i++)
-    {
-      if (cmd->aliases[i] == NULL)
-        break;
-
-      if (first_time) {
-        SVN_ERR(svn_cmdline_fputs(" (", stream, pool));
-        first_time = FALSE;
-      }
-      else
-        SVN_ERR(svn_cmdline_fputs(", ", stream, pool));
-
-      SVN_ERR(svn_cmdline_fputs(cmd->aliases[i], stream, pool));
-    }
-
-  if (! first_time)
-    SVN_ERR(svn_cmdline_fputs(")", stream, pool));
-
-  if (help)
-    {
-      const apr_getopt_option_t *option;
-      const char *long_alias;
-      svn_boolean_t have_options = FALSE;
-      svn_boolean_t have_experimental = FALSE;
-
-      SVN_ERR(svn_cmdline_fprintf(stream, pool, ": "));
-
-      for (i = 0; i < SVN_OPT_MAX_PARAGRAPHS && cmd->help[i]; i++)
-        {
-          SVN_ERR(svn_cmdline_fprintf(stream, pool, "%s", _(cmd->help[i])));
-        }
-
-      /* Loop over all valid option codes attached to the subcommand */
-      for (i = 0; i < SVN_OPT_MAX_OPTIONS; i++)
-        {
-          if (cmd->valid_options[i])
-            {
-              if (!have_options)
-                {
-                  SVN_ERR(svn_cmdline_fputs(_("\nValid options:\n"),
-                                            stream, pool));
-                  have_options = TRUE;
-                }
-
-              /* convert each option code into an option */
-              option = get_option_from_code3(&long_alias, cmd->valid_options[i],
-                                             options_table, cmd, pool);
-
-              /* print the option's docstring */
-              if (option && option->description)
-                {
-                  const char *optstr;
-
-                  if (option->name && strncmp(option->name, "x-", 2) == 0)
-                    {
-                      if (verbose && !have_experimental)
-                        SVN_ERR(svn_cmdline_fputs(_("\nExperimental options:\n"),
-                                                  stream, pool));
-                      have_experimental = TRUE;
-                      if (!verbose)
-                        continue;
-                    }
-
-                  format_option(&optstr, option, long_alias, TRUE, pool);
-                  SVN_ERR(svn_cmdline_fprintf(stream, pool, "  %s\n",
-                                              optstr));
-                }
-            }
-        }
-      /* And global options too */
-      if (verbose && global_options && *global_options)
-        {
-          SVN_ERR(svn_cmdline_fputs(_("\nGlobal options:\n"),
-                                    stream, pool));
-          have_options = TRUE;
-
-          for (i = 0; global_options[i]; i++)
-            {
-
-              /* convert each option code into an option */
-              option = get_option_from_code3(&long_alias, global_options[i],
-                                             options_table, cmd, pool);
-
-              /* print the option's docstring */
-              if (option && option->description)
-                {
-                  const char *optstr;
-                  format_option(&optstr, option, long_alias, TRUE, pool);
-                  SVN_ERR(svn_cmdline_fprintf(stream, pool, "  %s\n",
-                                              optstr));
-                }
-            }
-        }
-
-      if (!verbose && global_options && *global_options)
-        SVN_ERR(svn_cmdline_fputs(_("\n(Use '-v' to show global and experimental options.)\n"),
-                                  stream, pool));
-      if (have_options)
-        SVN_ERR(svn_cmdline_fprintf(stream, pool, "\n"));
-    }
-
-  return SVN_NO_ERROR;
-}
-
-/* The body for svn_opt_print_generic_help3() function with standard error
- * handling semantic. Handling of errors implemented at caller side. */
-static svn_error_t *
-print_generic_help_body3(const char *header,
-                         const svn_opt_subcommand_desc3_t *cmd_table,
-                         const apr_getopt_option_t *opt_table,
-                         const char *footer,
-                         svn_boolean_t with_experimental,
-                         apr_pool_t *pool, FILE *stream)
-{
-  svn_boolean_t have_experimental = FALSE;
-  int i;
-
-  if (header)
-    SVN_ERR(svn_cmdline_fputs(header, stream, pool));
-
-  for (i = 0; cmd_table[i].name; i++)
-    {
-      if (strncmp(cmd_table[i].name, "x-", 2) == 0)
-        {
-          if (with_experimental && !have_experimental)
-            SVN_ERR(svn_cmdline_fputs(_("\nExperimental subcommands:\n"),
-                                      stream, pool));
-          have_experimental = TRUE;
-          if (!with_experimental)
-            continue;
-        }
-      SVN_ERR(svn_cmdline_fputs("   ", stream, pool));
-      SVN_ERR(print_command_info3(cmd_table + i, opt_table,
-                                  NULL, FALSE, FALSE,
-                                  pool, stream));
-      SVN_ERR(svn_cmdline_fputs("\n", stream, pool));
-    }
-
-  if (have_experimental && !with_experimental)
-    SVN_ERR(svn_cmdline_fputs(_("\n(Use '-v' to show experimental subcommands.)\n"),
-                              stream, pool));
-
-  SVN_ERR(svn_cmdline_fputs("\n", stream, pool));
-
-  if (footer)
-    SVN_ERR(svn_cmdline_fputs(footer, stream, pool));
-
-  return SVN_NO_ERROR;
-}
-
-static void
-print_generic_help(const char *header,
-                   const svn_opt_subcommand_desc3_t *cmd_table,
-                   const apr_getopt_option_t *opt_table,
-                   const char *footer,
-                   svn_boolean_t with_experimental,
-                   apr_pool_t *pool, FILE *stream)
-{
-  svn_error_t *err;
-
-  err = print_generic_help_body3(header, cmd_table, opt_table, footer,
-                                 with_experimental,
-                                 pool, stream);
-
-  /* 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 && err->apr_err != SVN_ERR_IO_PIPE_WRITE_ERROR)
-    svn_handle_error2(err, stderr, FALSE, "svn: ");
-  svn_error_clear(err);
-}
-
-void
-svn_opt_print_generic_help3(const char *header,
-                            const svn_opt_subcommand_desc3_t *cmd_table,
-                            const apr_getopt_option_t *opt_table,
-                            const char *footer,
-                            apr_pool_t *pool, FILE *stream)
-{
-  print_generic_help(header, cmd_table, opt_table, footer,
-                     TRUE, pool, stream);
-}
-
-
-/* The body of svn_opt_subcommand_help4(), which see.
- *
- * VERBOSE means show also the subcommand's global and experimental options.
- */
-static void
-subcommand_help(const char *subcommand,
-                const svn_opt_subcommand_desc3_t *table,
-                const apr_getopt_option_t *options_table,
-                const int *global_options,
-                svn_boolean_t verbose,
-                apr_pool_t *pool)
-{
-  const svn_opt_subcommand_desc3_t *cmd =
-    svn_opt_get_canonical_subcommand3(table, subcommand);
-  svn_error_t *err;
-
-  if (cmd)
-    err = print_command_info3(cmd, options_table, global_options,
-                              TRUE, verbose, pool, stdout);
-  else
-    err = svn_cmdline_fprintf(stderr, pool,
-                              _("\"%s\": unknown command.\n\n"), subcommand);
-
-  if (err) {
-    /* Issue #3014: Don't print anything on broken pipes. */
-    if (err->apr_err != SVN_ERR_IO_PIPE_WRITE_ERROR)
-      svn_handle_error2(err, stderr, FALSE, "svn: ");
-    svn_error_clear(err);
-  }
-}
-
-void
-svn_opt_subcommand_help4(const char *subcommand,
-                         const svn_opt_subcommand_desc3_t *table,
-                         const apr_getopt_option_t *options_table,
-                         const int *global_options,
-                         apr_pool_t *pool)
-{
-  subcommand_help(subcommand, table, options_table, global_options,
-                  TRUE, pool);
-}
-
 
 
 /*** Parsing arguments. ***/
@@ -885,137 +478,3 @@ svn_opt__arg_canonicalize_path(const cha
 
   return SVN_NO_ERROR;
 }
-
-
-svn_error_t *
-svn_opt__print_version_info(const char *pgm_name,
-                            const char *footer,
-                            const svn_version_extended_t *info,
-                            svn_boolean_t quiet,
-                            svn_boolean_t verbose,
-                            apr_pool_t *pool)
-{
-  if (quiet)
-    return svn_cmdline_printf(pool, "%s\n", SVN_VER_NUMBER);
-
-  SVN_ERR(svn_cmdline_printf(pool, _("%s, version %s\n"
-                                     "   compiled %s, %s on %s\n\n"),
-                             pgm_name, SVN_VERSION,
-                             svn_version_ext_build_date(info),
-                             svn_version_ext_build_time(info),
-                             svn_version_ext_build_host(info)));
-  SVN_ERR(svn_cmdline_printf(pool, "%s\n", svn_version_ext_copyright(info)));
-
-  if (footer)
-    {
-      SVN_ERR(svn_cmdline_printf(pool, "%s\n", footer));
-    }
-
-  if (verbose)
-    {
-      const apr_array_header_t *libs;
-
-      SVN_ERR(svn_cmdline_fputs(_("System information:\n\n"), stdout, pool));
-      SVN_ERR(svn_cmdline_printf(pool, _("* running on %s\n"),
-                                 svn_version_ext_runtime_host(info)));
-      if (svn_version_ext_runtime_osname(info))
-        {
-          SVN_ERR(svn_cmdline_printf(pool, _("  - %s\n"),
-                                     svn_version_ext_runtime_osname(info)));
-        }
-
-      libs = svn_version_ext_linked_libs(info);
-      if (libs && libs->nelts)
-        {
-          const svn_version_ext_linked_lib_t *lib;
-          int i;
-
-          SVN_ERR(svn_cmdline_fputs(_("* linked dependencies:\n"),
-                                    stdout, pool));
-          for (i = 0; i < libs->nelts; ++i)
-            {
-              lib = &APR_ARRAY_IDX(libs, i, svn_version_ext_linked_lib_t);
-              if (lib->runtime_version)
-                SVN_ERR(svn_cmdline_printf(pool,
-                                           "  - %s %s (compiled with %s)\n",
-                                           lib->name,
-                                           lib->runtime_version,
-                                           lib->compiled_version));
-              else
-                SVN_ERR(svn_cmdline_printf(pool,
-                                           "  - %s %s (static)\n",
-                                           lib->name,
-                                           lib->compiled_version));
-            }
-        }
-
-      libs = svn_version_ext_loaded_libs(info);
-      if (libs && libs->nelts)
-        {
-          const svn_version_ext_loaded_lib_t *lib;
-          int i;
-
-          SVN_ERR(svn_cmdline_fputs(_("* loaded shared libraries:\n"),
-                                    stdout, pool));
-          for (i = 0; i < libs->nelts; ++i)
-            {
-              lib = &APR_ARRAY_IDX(libs, i, svn_version_ext_loaded_lib_t);
-              if (lib->version)
-                SVN_ERR(svn_cmdline_printf(pool,
-                                           "  - %s   (%s)\n",
-                                           lib->name, lib->version));
-              else
-                SVN_ERR(svn_cmdline_printf(pool, "  - %s\n", lib->name));
-            }
-        }
-    }
-
-  return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_opt_print_help5(apr_getopt_t *os,
-                    const char *pgm_name,
-                    svn_boolean_t print_version,
-                    svn_boolean_t quiet,
-                    svn_boolean_t verbose,
-                    const char *version_footer,
-                    const char *header,
-                    const svn_opt_subcommand_desc3_t *cmd_table,
-                    const apr_getopt_option_t *option_table,
-                    const int *global_options,
-                    const char *footer,
-                    apr_pool_t *pool)
-{
-  apr_array_header_t *targets = NULL;
-
-  if (os)
-    SVN_ERR(svn_opt_parse_all_args(&targets, os, pool));
-
-  if (os && targets->nelts)  /* help on subcommand(s) requested */
-    {
-      int i;
-
-      for (i = 0; i < targets->nelts; i++)
-        {
-          subcommand_help(APR_ARRAY_IDX(targets, i, const char *),
-                          cmd_table, option_table, global_options,
-                          verbose, pool);
-        }
-    }
-  else if (print_version)   /* just --version */
-    {
-      SVN_ERR(svn_opt__print_version_info(pgm_name, version_footer,
-                                          svn_version_extended(verbose, pool),
-                                          quiet, verbose, pool));
-    }
-  else if (os && !targets->nelts)            /* `-h', `--help', or `help' */
-    print_generic_help(header, cmd_table, option_table, footer,
-                       verbose,
-                       pool, stdout);
-  else                                       /* unknown option or cmd */
-    SVN_ERR(svn_cmdline_fprintf(stderr, pool,
-                                _("Type '%s help' for usage.\n"), pgm_name));
-
-  return SVN_NO_ERROR;
-}

Copied: subversion/trunk/subversion/libsvn_subr/opt_subcommand.c (from r1925920, subversion/trunk/subversion/libsvn_subr/opt.c)
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/opt_subcommand.c?p2=subversion/trunk/subversion/libsvn_subr/opt_subcommand.c&p1=subversion/trunk/subversion/libsvn_subr/opt.c&r1=1925920&r2=1925921&rev=1925921&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/opt.c (original)
+++ subversion/trunk/subversion/libsvn_subr/opt_subcommand.c Wed May 28 21:05:56 2025
@@ -1,5 +1,5 @@
 /*
- * opt.c :  option and argument parsing for Subversion command lines
+ * opt.c :  subcommand stuff &  help
  *
  * ====================================================================
  *    Licensed to the Apache Software Foundation (ASF) under one
@@ -24,15 +24,11 @@
 
 
 #define APR_WANT_STRFUNC
+#define APR_WANT_STDIO
 #include <apr_want.h>
 
-#include <stdio.h>
-#include <string.h>
 #include <assert.h>
-#include <apr_pools.h>
 #include <apr_general.h>
-#include <apr_lib.h>
-#include <apr_file_info.h>
 
 #include "svn_hash.h"
 #include "svn_cmdline.h"
@@ -43,11 +39,6 @@
 #include "svn_dirent_uri.h"
 #include "svn_path.h"
 #include "svn_utf.h"
-#include "svn_time.h"
-#include "svn_props.h"
-#include "svn_ctype.h"
-
-#include "private/svn_opt_private.h"
 
 #include "opt.h"
 #include "svn_private_config.h"
@@ -463,430 +454,6 @@ svn_opt_subcommand_help4(const char *sub
 }
 
 
-
-/*** Parsing arguments. ***/
-#define DEFAULT_ARRAY_SIZE 5
-
-
-/* Copy STR into POOL and push the copy onto ARRAY. */
-static void
-array_push_str(apr_array_header_t *array,
-               const char *str,
-               apr_pool_t *pool)
-{
-  /* ### Not sure if this function is still necessary.  It used to
-     convert str to svn_stringbuf_t * and push it, but now it just
-     dups str in pool and pushes the copy.  So its only effect is
-     transfer str's lifetime to pool.  Is that something callers are
-     depending on? */
-
-  APR_ARRAY_PUSH(array, const char *) = apr_pstrdup(pool, str);
-}
-
-
-void
-svn_opt_push_implicit_dot_target(apr_array_header_t *targets,
-                                 apr_pool_t *pool)
-{
-  if (targets->nelts == 0)
-    APR_ARRAY_PUSH(targets, const char *) = ""; /* Ha! "", not ".", is the canonical */
-  assert(targets->nelts);
-}
-
-
-svn_error_t *
-svn_opt_parse_num_args(apr_array_header_t **args_p,
-                       apr_getopt_t *os,
-                       int num_args,
-                       apr_pool_t *pool)
-{
-  int i;
-  apr_array_header_t *args
-    = apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *));
-
-  /* loop for num_args and add each arg to the args array */
-  for (i = 0; i < num_args; i++)
-    {
-      if (os->ind >= os->argc)
-        {
-          return svn_error_create(SVN_ERR_CL_INSUFFICIENT_ARGS, 0, NULL);
-        }
-      array_push_str(args, os->argv[os->ind++], pool);
-    }
-
-  *args_p = args;
-  return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_opt_parse_all_args(apr_array_header_t **args_p,
-                       apr_getopt_t *os,
-                       apr_pool_t *pool)
-{
-  apr_array_header_t *args
-    = apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *));
-
-  if (os->ind > os->argc)
-    {
-      return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, 0, NULL);
-    }
-  while (os->ind < os->argc)
-    {
-      array_push_str(args, os->argv[os->ind++], pool);
-    }
-
-  *args_p = args;
-  return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_opt_parse_path(svn_opt_revision_t *rev,
-                   const char **truepath,
-                   const char *path /* UTF-8! */,
-                   apr_pool_t *pool)
-{
-  const char *peg_rev;
-
-  SVN_ERR(svn_opt__split_arg_at_peg_revision(truepath, &peg_rev, path, pool));
-
-  /* Parse the peg revision, if one was found */
-  if (strlen(peg_rev))
-    {
-      int ret;
-      svn_opt_revision_t start_revision, end_revision;
-
-      end_revision.kind = svn_opt_revision_unspecified;
-
-      if (peg_rev[1] == '\0')  /* looking at empty peg revision */
-        {
-          ret = 0;
-          start_revision.kind = svn_opt_revision_unspecified;
-          start_revision.value.number = 0;
-        }
-      else  /* looking at non-empty peg revision */
-        {
-          const char *rev_str = &peg_rev[1];
-
-          /* URLs get treated differently from wc paths. */
-          if (svn_path_is_url(path))
-            {
-              /* URLs are URI-encoded, so we look for dates with
-                 URI-encoded delimiters.  */
-              size_t rev_len = strlen(rev_str);
-              if (rev_len > 6
-                  && rev_str[0] == '%'
-                  && rev_str[1] == '7'
-                  && (rev_str[2] == 'B'
-                      || rev_str[2] == 'b')
-                  && rev_str[rev_len-3] == '%'
-                  && rev_str[rev_len-2] == '7'
-                  && (rev_str[rev_len-1] == 'D'
-                      || rev_str[rev_len-1] == 'd'))
-                {
-                  rev_str = svn_path_uri_decode(rev_str, pool);
-                }
-            }
-          ret = svn_opt_parse_revision(&start_revision,
-                                       &end_revision,
-                                       rev_str, pool);
-        }
-
-      if (ret || end_revision.kind != svn_opt_revision_unspecified)
-        {
-          /* If an svn+ssh URL was used and it contains only one @,
-           * provide an error message that presents a possible solution
-           * to the parsing error (issue #2349). */
-          if (strncmp(path, "svn+ssh://", 10) == 0)
-            {
-              const char *at;
-
-              at = strchr(path, '@');
-              if (at && strrchr(path, '@') == at)
-                return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
-                                         _("Syntax error parsing peg revision "
-                                           "'%s'; did you mean '%s@'?"),
-                                       &peg_rev[1], path);
-            }
-
-          return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
-                                   _("Syntax error parsing peg revision '%s'"),
-                                   &peg_rev[1]);
-        }
-      rev->kind = start_revision.kind;
-      rev->value = start_revision.value;
-    }
-  else
-    {
-      /* Didn't find a peg revision. */
-      rev->kind = svn_opt_revision_unspecified;
-    }
-
-  return SVN_NO_ERROR;
-}
-
-
-/* Note: This is substantially copied into svn_client_args_to_target_array() in
- * order to move to libsvn_client while maintaining backward compatibility. */
-svn_error_t *
-svn_opt__args_to_target_array(apr_array_header_t **targets_p,
-                              apr_getopt_t *os,
-                              const apr_array_header_t *known_targets,
-                              apr_pool_t *pool)
-{
-  int i;
-  svn_error_t *err = SVN_NO_ERROR;
-  apr_array_header_t *input_targets =
-    apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *));
-  apr_array_header_t *output_targets =
-    apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *));
-
-  /* Step 1:  create a master array of targets that are in UTF-8
-     encoding, and come from concatenating the targets left by apr_getopt,
-     plus any extra targets (e.g., from the --targets switch.) */
-
-  for (; os->ind < os->argc; os->ind++)
-    {
-      /* The apr_getopt targets are still in native encoding. */
-      const char *raw_target = os->argv[os->ind];
-      SVN_ERR(svn_utf_cstring_to_utf8
-              ((const char **) apr_array_push(input_targets),
-               raw_target, pool));
-    }
-
-  if (known_targets)
-    {
-      for (i = 0; i < known_targets->nelts; i++)
-        {
-          /* The --targets array have already been converted to UTF-8,
-             because we needed to split up the list with svn_cstring_split. */
-          const char *utf8_target = APR_ARRAY_IDX(known_targets,
-                                                  i, const char *);
-          APR_ARRAY_PUSH(input_targets, const char *) = utf8_target;
-        }
-    }
-
-  /* Step 2:  process each target.  */
-
-  for (i = 0; i < input_targets->nelts; i++)
-    {
-      const char *utf8_target = APR_ARRAY_IDX(input_targets, i, const char *);
-      const char *true_target;
-      const char *target;      /* after all processing is finished */
-      const char *peg_rev;
-
-      /*
-       * This is needed so that the target can be properly canonicalized,
-       * otherwise the canonicalization does not treat a ".@BASE" as a "."
-       * with a BASE peg revision, and it is not canonicalized to "@BASE".
-       * If any peg revision exists, it is appended to the final
-       * canonicalized path or URL.  Do not use svn_opt_parse_path()
-       * because the resulting peg revision is a structure that would have
-       * to be converted back into a string.  Converting from a string date
-       * to the apr_time_t field in the svn_opt_revision_value_t and back to
-       * a string would not necessarily preserve the exact bytes of the
-       * input date, so its easier just to keep it in string form.
-       */
-      SVN_ERR(svn_opt__split_arg_at_peg_revision(&true_target, &peg_rev,
-                                                 utf8_target, pool));
-
-      /* URLs and wc-paths get treated differently. */
-      if (svn_path_is_url(true_target))
-        {
-          SVN_ERR(svn_opt__arg_canonicalize_url(&true_target, true_target,
-                                                 pool));
-        }
-      else  /* not a url, so treat as a path */
-        {
-          const char *base_name;
-
-          SVN_ERR(svn_opt__arg_canonicalize_path(&true_target, true_target,
-                                                 pool));
-
-          /* If the target has the same name as a Subversion
-             working copy administrative dir, skip it. */
-          base_name = svn_dirent_basename(true_target, pool);
-
-          /* FIXME:
-             The canonical list of administrative directory names is
-             maintained in libsvn_wc/adm_files.c:svn_wc_set_adm_dir().
-             That list can't be used here, because that use would
-             create a circular dependency between libsvn_wc and
-             libsvn_subr.  Make sure changes to the lists are always
-             synchronized! */
-          if (0 == strcmp(base_name, ".svn")
-              || 0 == strcmp(base_name, "_svn"))
-            {
-              err = svn_error_createf(SVN_ERR_RESERVED_FILENAME_SPECIFIED,
-                                      err, _("'%s' ends in a reserved name"),
-                                      utf8_target);
-              continue;
-            }
-        }
-
-      target = apr_pstrcat(pool, true_target, peg_rev, SVN_VA_NULL);
-
-      APR_ARRAY_PUSH(output_targets, const char *) = target;
-    }
-
-
-  /* kff todo: need to remove redundancies from targets before
-     passing it to the cmd_func. */
-
-  *targets_p = output_targets;
-
-  return err;
-}
-
-svn_error_t *
-svn_opt_parse_revprop(apr_hash_t **revprop_table_p, const char *revprop_spec,
-                      apr_pool_t *pool)
-{
-  const char *sep, *propname;
-  svn_string_t *propval;
-
-  if (! *revprop_spec)
-    return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
-                            _("Revision property pair is empty"));
-
-  if (! *revprop_table_p)
-    *revprop_table_p = apr_hash_make(pool);
-
-  sep = strchr(revprop_spec, '=');
-  if (sep)
-    {
-      propname = apr_pstrndup(pool, revprop_spec, sep - revprop_spec);
-      SVN_ERR(svn_utf_cstring_to_utf8(&propname, propname, pool));
-      propval = svn_string_create(sep + 1, pool);
-    }
-  else
-    {
-      SVN_ERR(svn_utf_cstring_to_utf8(&propname, revprop_spec, pool));
-      propval = svn_string_create_empty(pool);
-    }
-
-  if (!svn_prop_name_is_valid(propname))
-    return svn_error_createf(SVN_ERR_CLIENT_PROPERTY_NAME, NULL,
-                             _("'%s' is not a valid Subversion property name"),
-                             propname);
-
-  svn_hash_sets(*revprop_table_p, propname, propval);
-
-  return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_opt__split_arg_at_peg_revision(const char **true_target,
-                                   const char **peg_revision,
-                                   const char *utf8_target,
-                                   apr_pool_t *pool)
-{
-  const char *peg_start = NULL; /* pointer to the peg revision, if any */
-  const char *ptr;
-
-  for (ptr = (utf8_target + strlen(utf8_target) - 1); ptr >= utf8_target;
-        --ptr)
-    {
-      /* If we hit a path separator, stop looking.  This is OK
-          only because our revision specifiers can't contain '/'. */
-      if (*ptr == '/')
-        break;
-
-      if (*ptr == '@')
-        {
-          peg_start = ptr;
-          break;
-        }
-    }
-
-  if (peg_start)
-    {
-      *true_target = apr_pstrmemdup(pool, utf8_target, ptr - utf8_target);
-      if (peg_revision)
-        *peg_revision = apr_pstrdup(pool, peg_start);
-    }
-  else
-    {
-      *true_target = utf8_target;
-      if (peg_revision)
-        *peg_revision = "";
-    }
-
-  return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_opt__arg_canonicalize_url(const char **url_out, const char *url_in,
-                              apr_pool_t *pool)
-{
-  const char *target;
-
-  /* Convert to URI. */
-  target = svn_path_uri_from_iri(url_in, pool);
-  /* Auto-escape some ASCII characters. */
-  target = svn_path_uri_autoescape(target, pool);
-
-#if '/' != SVN_PATH_LOCAL_SEPARATOR
-  /* Allow using file:///C:\users\me/repos on Windows, like we did in 1.6 */
-  if (strchr(target, SVN_PATH_LOCAL_SEPARATOR))
-    {
-      char *p = apr_pstrdup(pool, target);
-      target = p;
-
-      /* Convert all local-style separators to the canonical ones. */
-      for (; *p != '\0'; ++p)
-        if (*p == SVN_PATH_LOCAL_SEPARATOR)
-          *p = '/';
-    }
-#endif
-
-  /* Verify that no backpaths are present in the URL. */
-  if (svn_path_is_backpath_present(target))
-    return svn_error_createf(SVN_ERR_BAD_URL, 0,
-                             _("URL '%s' contains a '..' element"),
-                             target);
-
-  /* Strip any trailing '/' and collapse other redundant elements. */
-  target = svn_uri_canonicalize(target, pool);
-
-  *url_out = target;
-  return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_opt__arg_canonicalize_path(const char **path_out, const char *path_in,
-                               apr_pool_t *pool)
-{
-  const char *apr_target;
-  char *truenamed_target; /* APR-encoded */
-  apr_status_t apr_err;
-
-  /* canonicalize case, and change all separators to '/'. */
-  SVN_ERR(svn_path_cstring_from_utf8(&apr_target, path_in, pool));
-  apr_err = apr_filepath_merge(&truenamed_target, "", apr_target,
-                               APR_FILEPATH_TRUENAME, pool);
-
-  if (!apr_err)
-    /* We have a canonicalized APR-encoded target now. */
-    apr_target = truenamed_target;
-  else if (APR_STATUS_IS_ENOENT(apr_err))
-    /* It's okay for the file to not exist, that just means we
-       have to accept the case given to the client. We'll use
-       the original APR-encoded target. */
-    ;
-  else
-    return svn_error_createf(apr_err, NULL,
-                             _("Error resolving case of '%s'"),
-                             svn_dirent_local_style(path_in, pool));
-
-  /* convert back to UTF-8. */
-  SVN_ERR(svn_path_cstring_to_utf8(path_out, apr_target, pool));
-  *path_out = svn_dirent_canonicalize(*path_out, pool);
-
-  return SVN_NO_ERROR;
-}
-
-
 svn_error_t *
 svn_opt__print_version_info(const char *pgm_name,
                             const char *footer,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.