C. Michael Pilato wrote on Fri, May 03, 2013 at 08:56:25 -0400:
> On 05/02/2013 04:45 PM, Mattias Engdegård wrote:
> > It is quite annoying that some of the more common error messages, the
> > 
> > svn: invalid option: --gurgle
> > 
> > kind, are entirely untranslatable because they are printed directly by 
> > APR which does not have any concept of translation at all. (This was 
> > reported before but met with silence:
> > http://svn.haxx.se/dev/archive-2008-05/1445.shtml)
> > 
> > It is not easy to fix it in a clean way; ideally, APR would return a 
> > detailed error code together with the required string parameters, but 
> > it doesn't. Even if we did change APR to that effect, it would be an 
> > incompatibility requiring a new APR version for use with Subversion.
> > 
> > This patch, instead, installs an apr_getopt_err_fn_t, acting as a 
> > replacement for fprintf. It is admittedly a hack, but quite a 
> > localised one -- it doesn't foul up any other code -- and does not 
> > have any negative effects that I can think of. In short, it should be 
> > a strict improvement.
> > 
> > Should APR's getopt error strings change, all that will happen is that 
> > they are shown untranslated, just like any other translated strings.
> 
> It's a hack, to be sure, but it doesn't strike me as one that carries a
> particularly high penalty.  Plus, it's ultimately not much more of a hack
> than we already employ in *much* more commonly executed code -- the code
> which determines which of the svn_error_t's in the chain are "tracing
> errors".  (See svn_error__is_tracing_link().)
> 
> +1 (from me, at least) to commit.  That said, I know danielsh voiced some
> pretty strong opinions the opposite direction about this on IRC, so please
> respect those and see if he's willing to budge before moving forward.

It's a hack.  It hardcodes the specific first and third arguments to the
    (os->errfn)("%s: %s: %c\n", _, "invalid option", _);
call in APR's unix/getopt.c.  The only benefit we get in return is
translating six two-word error messages in option parsing.

Anyway, how about this:

static void
emit_option_error(void *baton, const char *fmt, ...)
{
  struct { FILE *stream; const char *argv0; apr_pool_t *pool; } *b = baton;
  va_list va;
  va_start(va, fmt);
  vfprintf(b->stream, fmt, va);
  va_end(va);
  svn_error_clear(svn_cmdline_fprintf(b->pool, 
                                      _("%s: See '%s --help' or '%s --help 
<subcommand>'"),
                                      b->argv0, b->argv0, b->argv0));
  return;
}

Reply via email to