svn commit: r1925930 - in /subversion/branches/utf8-cmdline-prototype: ./ subversion/libsvn_subr/cmdline.c subversion/libsvn_subr/cmdline_editor.c subversion/libsvn_subr/opt.c subversion/libsvn_subr/opt_revision.c subversion/libsvn_subr/opt_subcommand.c

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <[email protected]>
Author: rinrab
Date: Thu May 29 11:41:35 2025
New Revision: 1925930

URL: http://svn.apache.org/viewvc?rev=1925930&view=rev
Log:
On the 'utf8-cmdline-prototype' branch: sync with trunk.

Added:
    subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/cmdline_editor.c
      - copied unchanged from r1925929, subversion/trunk/subversion/libsvn_subr/cmdline_editor.c
    subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/opt_revision.c
      - copied unchanged from r1925929, subversion/trunk/subversion/libsvn_subr/opt_revision.c
    subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/opt_subcommand.c
      - copied unchanged from r1925929, subversion/trunk/subversion/libsvn_subr/opt_subcommand.c
Modified:
    subversion/branches/utf8-cmdline-prototype/   (props changed)
    subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/cmdline.c
    subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/opt.c

Propchange: subversion/branches/utf8-cmdline-prototype/
------------------------------------------------------------------------------
  Merged /subversion/trunk:r1925915-1925929

Modified: subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/cmdline.c
URL: http://svn.apache.org/viewvc/subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/cmdline.c?rev=1925930&r1=1925929&r2=1925930&view=diff
==============================================================================
--- subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/cmdline.c (original)
+++ subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/cmdline.c Thu May 29 11:41:35 2025
@@ -1240,522 +1240,6 @@ svn_cmdline__be_interactive(svn_boolean_
 }
 
 
-/* Helper for the edit_externally functions.  Set *EDITOR to some path to an
-   editor binary, in native C string on Unix/Linux platforms and in UTF-8
-   string on Windows platform.  Sources to search include: the EDITOR_CMD
-   argument (if not NULL), $SVN_EDITOR, the runtime CONFIG variable (if CONFIG
-   is not NULL), $VISUAL, $EDITOR.  Return
-   SVN_ERR_CL_NO_EXTERNAL_EDITOR if no binary can be found. */
-static svn_error_t *
-find_editor_binary(const char **editor,
-                   const char *editor_cmd,
-                   apr_hash_t *config,
-                   apr_pool_t *pool)
-{
-  const char *e;
-  const char *e_cfg;
-  struct svn_config_t *cfg;
-  apr_status_t status;
-
-  /* Use the editor specified on the command line via --editor-cmd, if any. */
-#ifdef WIN32
-  /* On Windows, editor_cmd is transcoded to the system active code page
-     because we use main() as a entry point without APR's (or our own) wrapper
-     in command line tools. */
-  if (editor_cmd)
-    {
-      SVN_ERR(svn_utf_cstring_to_utf8(&e, editor_cmd, pool));
-    }
-  else
-    {
-      e = NULL;
-    }
-#else
-  e = editor_cmd;
-#endif
-
-  /* Otherwise look for the Subversion-specific environment variable. */
-  if (! e)
-    {
-      status = apr_env_get((char **)&e, "SVN_EDITOR", pool);
-      if (status || ! *e)
-        {
-           e = NULL;
-        }
-    }
-
-  /* If not found then fall back on the config file. */
-  if (! e)
-    {
-      cfg = config ? svn_hash_gets(config, SVN_CONFIG_CATEGORY_CONFIG) : NULL;
-      svn_config_get(cfg, &e_cfg, SVN_CONFIG_SECTION_HELPERS,
-                     SVN_CONFIG_OPTION_EDITOR_CMD, NULL);
-#ifdef WIN32
-      if (e_cfg)
-        {
-          /* On Windows, we assume that config values are set in system active
-             code page, so we need transcode it here. */
-          SVN_ERR(svn_utf_cstring_to_utf8(&e, e_cfg, pool));
-        }
-#else
-      e = e_cfg;
-#endif
-    }
-
-  /* If not found yet then try general purpose environment variables. */
-  if (! e)
-    {
-      status = apr_env_get((char**)&e, "VISUAL", pool);
-      if (status || ! *e)
-        {
-           e = NULL;
-        }
-    }
-  if (! e)
-    {
-      status = apr_env_get((char**)&e, "EDITOR", pool);
-      if (status || ! *e)
-        {
-           e = NULL;
-        }
-    }
-
-#ifdef SVN_CLIENT_EDITOR
-  /* If still not found then fall back on the hard-coded default. */
-  if (! e)
-    e = SVN_CLIENT_EDITOR;
-#endif
-
-  /* Error if there is no editor specified */
-  if (e)
-    {
-      const char *c;
-
-      for (c = e; *c; c++)
-        if (!svn_ctype_isspace(*c))
-          break;
-
-      if (! *c)
-        return svn_error_create
-          (SVN_ERR_CL_NO_EXTERNAL_EDITOR, NULL,
-           _("The EDITOR, SVN_EDITOR or VISUAL environment variable or "
-             "'editor-cmd' run-time configuration option is empty or "
-             "consists solely of whitespace. Expected a shell command."));
-    }
-  else
-    return svn_error_create
-      (SVN_ERR_CL_NO_EXTERNAL_EDITOR, NULL,
-       _("None of the environment variables SVN_EDITOR, VISUAL or EDITOR are "
-         "set, and no 'editor-cmd' run-time configuration option was found"));
-
-  *editor = e;
-  return SVN_NO_ERROR;
-}
-
-/* Wrapper around apr_pescape_shell() which also escapes whitespace. */
-static const char *
-escape_path(apr_pool_t *pool, const char *orig_path)
-{
-  apr_size_t len, esc_len;
-  apr_status_t status;
-
-  len = strlen(orig_path);
-  esc_len = 0;
-
-  status = apr_escape_shell(NULL, orig_path, len, &esc_len);
-
-  if (status == APR_NOTFOUND)
-    {
-      /* No special characters found by APR, so just surround it in double
-         quotes in case there is whitespace, which APR (as of 1.6.5) doesn't
-         consider special. */
-      return apr_psprintf(pool, "\"%s\"", orig_path);
-    }
-  else
-    {
-#ifdef WIN32
-      const char *p;
-      /* Following the advice from
-         https://docs.microsoft.com/en-us/archive/blogs/twistylittlepassagesallalike/everyone-quotes-command-line-arguments-the-wrong-way
-         1. Surround argument with double-quotes
-         2. Escape backslashes, if they're followed by a double-quote, and double-quotes
-         3. Escape any metacharacter, including double-quotes, with ^ */
-
-      /* Use APR's buffer size as an approximation for how large the escaped
-         string should be, plus 4 bytes for the leading/trailing ^" */
-      svn_stringbuf_t *buf = svn_stringbuf_create_ensure(esc_len + 4, pool);
-      svn_stringbuf_appendcstr(buf, "^\"");
-      for (p = orig_path; *p; p++)
-        {
-          int nr_backslash = 0;
-          while (*p && *p == '\\')
-            {
-              nr_backslash++;
-              p++;
-            }
-
-          if (!*p)
-            /* We've reached the end of the argument, so we need 2n backslash
-               characters.  That will be interpreted as n backslashes and the
-               final double-quote character will be interpreted as the final
-               string delimiter. */
-            svn_stringbuf_appendfill(buf, '\\', nr_backslash * 2);
-          else if (*p == '"')
-            {
-              /* Double-quote as part of the argument means we need to double
-                 any preceding backslashes and then add one to escape the
-                 double-quote. */
-              svn_stringbuf_appendfill(buf, '\\', nr_backslash * 2 + 1);
-              svn_stringbuf_appendbyte(buf, '^');
-              svn_stringbuf_appendbyte(buf, *p);
-            }
-          else
-            {
-              /* Since there's no double-quote, we just insert any backslashes
-                 literally.  No escaping needed. */
-              svn_stringbuf_appendfill(buf, '\\', nr_backslash);
-              if (strchr("()%!^<>&|", *p))
-                svn_stringbuf_appendbyte(buf, '^');
-              svn_stringbuf_appendbyte(buf, *p);
-            }
-        }
-      svn_stringbuf_appendcstr(buf, "^\"");
-      return buf->data;
-#else
-      char *path, *p, *esc_path;
-
-      /* Account for whitespace, since APR doesn't */
-      for (p = (char *)orig_path; *p; p++)
-        if (strchr(" \t\n\r", *p))
-          esc_len++;
-
-      path = apr_pcalloc(pool, esc_len);
-      apr_escape_shell(path, orig_path, len, NULL);
-
-      p = esc_path = apr_pcalloc(pool, len + esc_len + 1);
-      while (*path)
-        {
-          if (strchr(" \t\n\r", *path))
-            *p++ = '\\';
-          *p++ = *path++;
-        }
-
-      return esc_path;
-#endif
-    }
-}
-
-svn_error_t *
-svn_cmdline__edit_file_externally(const char *path,
-                                  const char *editor_cmd,
-                                  apr_hash_t *config,
-                                  apr_pool_t *pool)
-{
-  const char *editor, *cmd, *base_dir, *file_name, *base_dir_apr;
-  const char *file_name_local;
-#ifdef WIN32
-  const WCHAR *wcmd;
-#endif
-  char *old_cwd;
-  int sys_err;
-  apr_status_t apr_err;
-
-  svn_dirent_split(&base_dir, &file_name, path, pool);
-
-  SVN_ERR(find_editor_binary(&editor, editor_cmd, config, pool));
-
-  apr_err = apr_filepath_get(&old_cwd, APR_FILEPATH_NATIVE, pool);
-  if (apr_err)
-    return svn_error_wrap_apr(apr_err, _("Can't get working directory"));
-
-  /* APR doesn't like "" directories */
-  if (base_dir[0] == '\0')
-    base_dir_apr = ".";
-  else
-    SVN_ERR(svn_path_cstring_from_utf8(&base_dir_apr, base_dir, pool));
-
-  apr_err = apr_filepath_set(base_dir_apr, pool);
-  if (apr_err)
-    return svn_error_wrap_apr
-      (apr_err, _("Can't change working directory to '%s'"), base_dir);
-
-  SVN_ERR(svn_path_cstring_from_utf8(&file_name_local,
-                                     escape_path(pool, file_name), pool));
-  /* editor is explicitly documented as being interpreted by the user's shell,
-     and as such should already be quoted/escaped as needed. */
-#ifndef WIN32
-  cmd = apr_psprintf(pool, "%s %s", editor, file_name_local);
-  sys_err = system(cmd);
-#else
-  cmd = apr_psprintf(pool, "\"%s %s\"", editor, file_name_local);
-  SVN_ERR(svn_utf__win32_utf8_to_utf16(&wcmd, cmd, NULL, pool));
-  sys_err = _wsystem(wcmd);
-#endif
-
-  apr_err = apr_filepath_set(old_cwd, pool);
-  if (apr_err)
-    svn_handle_error2(svn_error_wrap_apr
-                      (apr_err, _("Can't restore working directory")),
-                      stderr, TRUE /* fatal */, "svn: ");
-
-  if (sys_err)
-    {
-      const char *cmd_utf8;
-
-      /* Extracting any meaning from sys_err is platform specific, so just
-         use the raw value. */
-      SVN_ERR(svn_path_cstring_to_utf8(&cmd_utf8, cmd, pool));
-      return svn_error_createf(SVN_ERR_EXTERNAL_PROGRAM, NULL,
-                               _("system('%s') returned %d"),
-                               cmd_utf8, sys_err);
-    }
-
-  return SVN_NO_ERROR;
-}
-
-
-svn_error_t *
-svn_cmdline__edit_string_externally(svn_string_t **edited_contents /* UTF-8! */,
-                                    const char **tmpfile_left /* UTF-8! */,
-                                    const char *editor_cmd,
-                                    const char *base_dir /* UTF-8! */,
-                                    const svn_string_t *contents /* UTF-8! */,
-                                    const char *filename,
-                                    apr_hash_t *config,
-                                    svn_boolean_t as_text,
-                                    const char *encoding,
-                                    apr_pool_t *pool)
-{
-  const char *editor;
-  const char *cmd;
-#ifdef WIN32
-  const WCHAR *wcmd;
-#endif
-  apr_file_t *tmp_file;
-  const char *tmpfile_name;
-  const char *tmpfile_native;
-  const char *base_dir_apr;
-  svn_string_t *translated_contents;
-  apr_status_t apr_err;
-  apr_size_t written;
-  apr_finfo_t finfo_before, finfo_after;
-  svn_error_t *err = SVN_NO_ERROR;
-  char *old_cwd;
-  int sys_err;
-  svn_boolean_t remove_file = TRUE;
-
-  SVN_ERR(find_editor_binary(&editor, editor_cmd, config, pool));
-
-  /* Convert file contents from UTF-8/LF if desired. */
-  if (as_text)
-    {
-      const char *translated;
-      SVN_ERR(svn_subst_translate_cstring2(contents->data, &translated,
-                                           APR_EOL_STR, FALSE,
-                                           NULL, FALSE, pool));
-      translated_contents = svn_string_create_empty(pool);
-      if (encoding)
-        SVN_ERR(svn_utf_cstring_from_utf8_ex2(&translated_contents->data,
-                                              translated, encoding, pool));
-      else
-        SVN_ERR(svn_utf_cstring_from_utf8(&translated_contents->data,
-                                          translated, pool));
-      translated_contents->len = strlen(translated_contents->data);
-    }
-  else
-    translated_contents = svn_string_dup(contents, pool);
-
-  /* Move to BASE_DIR to avoid getting characters that need quoting
-     into tmpfile_name */
-  apr_err = apr_filepath_get(&old_cwd, APR_FILEPATH_NATIVE, pool);
-  if (apr_err)
-    return svn_error_wrap_apr(apr_err, _("Can't get working directory"));
-
-  /* APR doesn't like "" directories */
-  if (base_dir[0] == '\0')
-    base_dir_apr = ".";
-  else
-    SVN_ERR(svn_path_cstring_from_utf8(&base_dir_apr, base_dir, pool));
-  apr_err = apr_filepath_set(base_dir_apr, pool);
-  if (apr_err)
-    {
-      return svn_error_wrap_apr
-        (apr_err, _("Can't change working directory to '%s'"), base_dir);
-    }
-
-  /*** From here on, any problems that occur require us to cd back!! ***/
-
-  /* Ask the working copy for a temporary file named FILENAME-something. */
-  err = svn_io_open_uniquely_named(&tmp_file, &tmpfile_name,
-                                   "" /* dirpath */,
-                                   filename,
-                                   ".tmp",
-                                   svn_io_file_del_none, pool, pool);
-
-  if (err && (APR_STATUS_IS_EACCES(err->apr_err) || err->apr_err == EROFS))
-    {
-      const char *temp_dir_apr;
-
-      svn_error_clear(err);
-
-      SVN_ERR(svn_io_temp_dir(&base_dir, pool));
-
-      SVN_ERR(svn_path_cstring_from_utf8(&temp_dir_apr, base_dir, pool));
-      apr_err = apr_filepath_set(temp_dir_apr, pool);
-      if (apr_err)
-        {
-          return svn_error_wrap_apr
-            (apr_err, _("Can't change working directory to '%s'"), base_dir);
-        }
-
-      err = svn_io_open_uniquely_named(&tmp_file, &tmpfile_name,
-                                       "" /* dirpath */,
-                                       filename,
-                                       ".tmp",
-                                       svn_io_file_del_none, pool, pool);
-    }
-
-  if (err)
-    goto cleanup2;
-
-  /*** From here on, any problems that occur require us to cleanup
-       the file we just created!! ***/
-
-  /* Dump initial CONTENTS to TMP_FILE. */
-  err = svn_io_file_write_full(tmp_file, translated_contents->data,
-                               translated_contents->len, &written,
-                               pool);
-
-  err = svn_error_compose_create(err, svn_io_file_close(tmp_file, pool));
-
-  /* Make sure the whole CONTENTS were written, else return an error. */
-  if (err)
-    goto cleanup;
-
-  /* Get information about the temporary file before the user has
-     been allowed to edit its contents. */
-  err = svn_io_stat(&finfo_before, tmpfile_name, APR_FINFO_MTIME, pool);
-  if (err)
-    goto cleanup;
-
-  /* Backdate the file a little bit in case the editor is very fast
-     and doesn't change the size.  (Use two seconds, since some
-     filesystems have coarse granularity.)  It's OK if this call
-     fails, so we don't check its return value.*/
-  err = svn_io_set_file_affected_time(finfo_before.mtime
-                                              - apr_time_from_sec(2),
-                                      tmpfile_name, pool);
-  svn_error_clear(err);
-
-  /* Stat it again to get the mtime we actually set. */
-  err = svn_io_stat(&finfo_before, tmpfile_name,
-                    APR_FINFO_MTIME | APR_FINFO_SIZE, pool);
-  if (err)
-    goto cleanup;
-
-  /* Prepare the editor command line.  */
-  err = svn_path_cstring_from_utf8(&tmpfile_native,
-                                   escape_path(pool, tmpfile_name), pool);
-  if (err)
-    goto cleanup;
-
-  /* editor is explicitly documented as being interpreted by the user's shell,
-     and as such should already be quoted/escaped as needed. */
-#ifndef WIN32
-  cmd = apr_psprintf(pool, "%s %s", editor, tmpfile_native);
-#else
-  cmd = apr_psprintf(pool, "\"%s %s\"", editor, tmpfile_native);
-#endif
-
-  /* If the caller wants us to leave the file around, return the path
-     of the file we'll use, and make a note not to destroy it.  */
-  if (tmpfile_left)
-    {
-      *tmpfile_left = svn_dirent_join(base_dir, tmpfile_name, pool);
-      remove_file = FALSE;
-    }
-
-  /* Now, run the editor command line.  */
-#ifndef WIN32
-  sys_err = system(cmd);
-#else
-  SVN_ERR(svn_utf__win32_utf8_to_utf16(&wcmd, cmd, NULL, pool));
-  sys_err = _wsystem(wcmd);
-#endif
-  if (sys_err != 0)
-    {
-      const char *cmd_utf8;
-
-      /* Extracting any meaning from sys_err is platform specific, so just
-         use the raw value. */
-      SVN_ERR(svn_path_cstring_to_utf8(&cmd_utf8, cmd, pool));
-      err =  svn_error_createf(SVN_ERR_EXTERNAL_PROGRAM, NULL,
-                               _("system('%s') returned %d"),
-                               cmd_utf8, sys_err);
-      goto cleanup;
-    }
-
-  /* Get information about the temporary file after the assumed editing. */
-  err = svn_io_stat(&finfo_after, tmpfile_name,
-                    APR_FINFO_MTIME | APR_FINFO_SIZE, pool);
-  if (err)
-    goto cleanup;
-
-  /* If the file looks changed... */
-  if ((finfo_before.mtime != finfo_after.mtime) ||
-      (finfo_before.size != finfo_after.size))
-    {
-      svn_stringbuf_t *edited_contents_s;
-      err = svn_stringbuf_from_file2(&edited_contents_s, tmpfile_name, pool);
-      if (err)
-        goto cleanup;
-
-      *edited_contents = svn_stringbuf__morph_into_string(edited_contents_s);
-
-      /* Translate back to UTF8/LF if desired. */
-      if (as_text)
-        {
-          err = svn_subst_translate_string2(edited_contents, NULL, NULL,
-                                            *edited_contents, encoding, FALSE,
-                                            pool, pool);
-          if (err)
-            {
-              err = svn_error_quick_wrap
-                (err,
-                 _("Error normalizing edited contents to internal format"));
-              goto cleanup;
-            }
-        }
-    }
-  else
-    {
-      /* No edits seem to have been made */
-      *edited_contents = NULL;
-    }
-
- cleanup:
-  if (remove_file)
-    {
-      /* Remove the file from disk.  */
-      err = svn_error_compose_create(
-              err,
-              svn_io_remove_file2(tmpfile_name, FALSE, pool));
-    }
-
- cleanup2:
-  /* If we against all probability can't cd back, all further relative
-     file references would be screwed up, so we have to abort. */
-  apr_err = apr_filepath_set(old_cwd, pool);
-  if (apr_err)
-    {
-      svn_handle_error2(svn_error_wrap_apr
-                        (apr_err, _("Can't restore working directory")),
-                        stderr, TRUE /* fatal */, "svn: ");
-    }
-
-  return svn_error_trace(err);
-}
-
 svn_error_t *
 svn_cmdline__parse_trust_options(
                         svn_boolean_t *trust_server_cert_unknown_ca,

Modified: subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/opt.c
URL: http://svn.apache.org/viewvc/subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/opt.c?rev=1925930&r1=1925929&r2=1925930&view=diff
==============================================================================
--- subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/opt.c (original)
+++ subversion/branches/utf8-cmdline-prototype/subversion/libsvn_subr/opt.c Thu May 29 11:41:35 2025
@@ -55,752 +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 revision and date options. ***/
-
-
-/** Parsing "X:Y"-style arguments. **/
-
-/* If WORD matches one of the special revision descriptors,
- * case-insensitively, set *REVISION accordingly:
- *
- *   - For "head", set REVISION->kind to svn_opt_revision_head.
- *
- *   - For "prev", set REVISION->kind to svn_opt_revision_previous.
- *
- *   - For "base", set REVISION->kind to svn_opt_revision_base.
- *
- *   - For "committed", set REVISION->kind to svn_opt_revision_committed.
- *
- * If match, return 0, else return -1 and don't touch REVISION.
- */
-static int
-revision_from_word(svn_opt_revision_t *revision, const char *word)
-{
-  if (svn_cstring_casecmp(word, "head") == 0)
-    {
-      revision->kind = svn_opt_revision_head;
-    }
-  else if (svn_cstring_casecmp(word, "prev") == 0)
-    {
-      revision->kind = svn_opt_revision_previous;
-    }
-  else if (svn_cstring_casecmp(word, "base") == 0)
-    {
-      revision->kind = svn_opt_revision_base;
-    }
-  else if (svn_cstring_casecmp(word, "committed") == 0)
-    {
-      revision->kind = svn_opt_revision_committed;
-    }
-  else
-    return -1;
-
-  return 0;
-}
-
-
-/* Parse one revision specification.  Return pointer to character
-   after revision, or NULL if the revision is invalid.  Modifies
-   str, so make sure to pass a copy of anything precious.  Uses
-   POOL for temporary allocation. */
-static char *parse_one_rev(svn_opt_revision_t *revision, char *str,
-                           apr_pool_t *pool)
-{
-  char *end, save;
-
-  /* Allow any number of 'r's to prefix a revision number, because
-     that way if a script pastes svn output into another svn command
-     (like "svn log -r${REV_COPIED_FROM_OUTPUT}"), it'll Just Work,
-     even when compounded.
-
-     As it happens, none of our special revision words begins with
-     "r".  If any ever do, then this code will have to get smarter.
-
-     Incidentally, this allows "r{DATE}".  We could avoid that with
-     some trivial code rearrangement, but it's not clear what would
-     be gained by doing so. */
-  while (*str == 'r')
-    str++;
-
-  if (*str == '{')
-    {
-      svn_boolean_t matched;
-      apr_time_t tm;
-      svn_error_t *err;
-
-      /* Brackets denote a date. */
-      str++;
-      end = strchr(str, '}');
-      if (!end)
-        return NULL;
-      *end = '\0';
-      err = svn_parse_date(&matched, &tm, str, apr_time_now(), pool);
-      if (err)
-        {
-          svn_error_clear(err);
-          return NULL;
-        }
-      if (!matched)
-        return NULL;
-      revision->kind = svn_opt_revision_date;
-      revision->value.date = tm;
-      return end + 1;
-    }
-  else if (svn_ctype_isdigit(*str))
-    {
-      /* It's a number. */
-      end = str + 1;
-      while (svn_ctype_isdigit(*end))
-        end++;
-      save = *end;
-      *end = '\0';
-      revision->kind = svn_opt_revision_number;
-      revision->value.number = SVN_STR_TO_REV(str);
-      *end = save;
-      return end;
-    }
-  else if (svn_ctype_isalpha(*str))
-    {
-      end = str + 1;
-      while (svn_ctype_isalpha(*end))
-        end++;
-      save = *end;
-      *end = '\0';
-      if (revision_from_word(revision, str) != 0)
-        return NULL;
-      *end = save;
-      return end;
-    }
-  else
-    return NULL;
-}
-
-
-int
-svn_opt_parse_revision(svn_opt_revision_t *start_revision,
-                       svn_opt_revision_t *end_revision,
-                       const char *arg,
-                       apr_pool_t *pool)
-{
-  char *left_rev, *right_rev, *end;
-
-  /* Operate on a copy of the argument. */
-  left_rev = apr_pstrdup(pool, arg);
-
-  right_rev = parse_one_rev(start_revision, left_rev, pool);
-  if (right_rev && *right_rev == ':')
-    {
-      right_rev++;
-      end = parse_one_rev(end_revision, right_rev, pool);
-      if (!end || *end != '\0')
-        return -1;
-    }
-  else if (!right_rev || *right_rev != '\0')
-    return -1;
-
-  return 0;
-}
-
-
-int
-svn_opt_parse_revision_to_range(apr_array_header_t *opt_ranges,
-                                const char *arg,
-                                apr_pool_t *pool)
-{
-  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;
-
-  if (svn_opt_parse_revision(&(range->start), &(range->end),
-                             arg, pool) == -1)
-    return -1;
-
-  APR_ARRAY_PUSH(opt_ranges, svn_opt_revision_range_t *) = range;
-  return 0;
-}
-
-int svn_opt_parse_change_to_range(apr_array_header_t *opt_ranges,
-                                  const char *arg,
-                                  apr_pool_t *result_pool)
-{
-  char *end;
-  svn_revnum_t changeno, changeno_end;
-  const char *s = arg;
-  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 == '-')
-    {
-      /* Negative number in range not supported with -c */
-      if (changeno < 0 || is_negative)
-        return -1;
-
-      s = end + 1;
-      while (*s == 'r')
-        s++;
-      changeno_end = strtol(s, &end, 10);
-
-      /* Negative number in range not supported with -c */
-      if (changeno_end < 0)
-          return -1;
-    }
-
-  /* Non-numeric change argument given to -c? */
-  if (end == arg || *end != '\0')
-    return -1;
-
-  /* There is no change 0 */
-  if (changeno == 0 || changeno_end == 0)
-    return -1;
-
-  /* The revision number cannot contain a double minus */
-  if (changeno < 0 && is_negative)
-    return -1;
-
-  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;
-    }
-
-  APR_ARRAY_PUSH(opt_ranges,
-                  svn_opt_revision_range_t *)
-    = svn_opt__revision_range_from_revnums(changeno, changeno_end,
-                                           result_pool);
-
-  return 0;
-}
-
-svn_error_t *
-svn_opt_parse_revnum(svn_revnum_t *rev, const char *str)
-{
-  /* Allow any number of 'r's to prefix a revision number. */
-  while (*str == 'r')
-    str++;
-
-  return svn_error_trace(svn_revnum_parse(rev, str, NULL));
-}
-
-svn_error_t *
-svn_opt_resolve_revisions(svn_opt_revision_t *peg_rev,
-                          svn_opt_revision_t *op_rev,
-                          svn_boolean_t is_url,
-                          svn_boolean_t notice_local_mods,
-                          apr_pool_t *pool)
-{
-  if (peg_rev->kind == svn_opt_revision_unspecified)
-    {
-      if (is_url)
-        {
-          peg_rev->kind = svn_opt_revision_head;
-        }
-      else
-        {
-          if (notice_local_mods)
-            peg_rev->kind = svn_opt_revision_working;
-          else
-            peg_rev->kind = svn_opt_revision_base;
-        }
-    }
-
-  if (op_rev->kind == svn_opt_revision_unspecified)
-    *op_rev = *peg_rev;
-
-  return SVN_NO_ERROR;
-}
-
-const char *
-svn_opt__revision_to_string(const svn_opt_revision_t *revision,
-                            apr_pool_t *result_pool)
-{
-  switch (revision->kind)
-    {
-      case svn_opt_revision_unspecified:
-        return "unspecified";
-      case svn_opt_revision_number:
-        return apr_psprintf(result_pool, "%ld", revision->value.number);
-      case svn_opt_revision_date:
-        /* ### svn_time_to_human_cstring()? */
-        return svn_time_to_cstring(revision->value.date, result_pool);
-      case svn_opt_revision_committed:
-        return "committed";
-      case svn_opt_revision_previous:
-        return "previous";
-      case svn_opt_revision_base:
-        return "base";
-      case svn_opt_revision_working:
-        return "working";
-      case svn_opt_revision_head:
-        return "head";
-      default:
-        return NULL;
-    }
-}
-
-svn_opt_revision_range_t *
-svn_opt__revision_range_create(const svn_opt_revision_t *start_revision,
-                               const svn_opt_revision_t *end_revision,
-                               apr_pool_t *result_pool)
-{
-  svn_opt_revision_range_t *range = apr_palloc(result_pool, sizeof(*range));
-
-  range->start = *start_revision;
-  range->end = *end_revision;
-  return range;
-}
-
-svn_opt_revision_range_t *
-svn_opt__revision_range_from_revnums(svn_revnum_t start_revnum,
-                                     svn_revnum_t end_revnum,
-                                     apr_pool_t *result_pool)
-{
-  svn_opt_revision_range_t *range = apr_palloc(result_pool, sizeof(*range));
-
-  range->start.kind = svn_opt_revision_number;
-  range->start.value.number = start_revnum;
-  range->end.kind = svn_opt_revision_number;
-  range->end.value.number = end_revnum;
-  return range;
-}
-
 
 
 /*** Parsing arguments. ***/
@@ -1237,137 +491,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;
-}
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.