Merge branch 'ef/non-ascii-parse-options-error-diag'
authorJunio C Hamano <gitster@pobox.com>
Fri, 15 Feb 2013 00:06:14 +0000 (16:06 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 15 Feb 2013 00:06:14 +0000 (16:06 -0800)
* ef/non-ascii-parse-options-error-diag:
parse-options: report uncorrupted multi-byte options

1  2 
parse-options.c
diff --combined parse-options.c
index a6ce9efb79df18ab433904024cce9cce2b1e56ce,052bf72bb88963cf81bb2303c0ab2354a2125617..c2cbca25cc6bb010996063c88c9af3e7b38aad5a
@@@ -3,7 -3,6 +3,7 @@@
  #include "cache.h"
  #include "commit.h"
  #include "color.h"
 +#include "utf8.h"
  
  static int parse_options_usage(struct parse_opt_ctx_t *ctx,
                               const char * const *usagestr,
@@@ -19,6 -18,15 +19,6 @@@ int optbug(const struct option *opt, co
        return error("BUG: switch '%c' %s", opt->short_name, reason);
  }
  
 -int opterror(const struct option *opt, const char *reason, int flags)
 -{
 -      if (flags & OPT_SHORT)
 -              return error("switch `%c' %s", opt->short_name, reason);
 -      if (flags & OPT_UNSET)
 -              return error("option `no-%s' %s", opt->long_name, reason);
 -      return error("option `%s' %s", opt->long_name, reason);
 -}
 -
  static int get_arg(struct parse_opt_ctx_t *p, const struct option *opt,
                   int flags, const char **arg)
  {
@@@ -462,8 -470,11 +462,11 @@@ int parse_options(int argc, const char 
        default: /* PARSE_OPT_UNKNOWN */
                if (ctx.argv[0][1] == '-') {
                        error("unknown option `%s'", ctx.argv[0] + 2);
-               } else {
+               } else if (isascii(*ctx.opt)) {
                        error("unknown switch `%c'", *ctx.opt);
+               } else {
+                       error("unknown non-ascii option in string: `%s'",
+                             ctx.argv[0]);
                }
                usage_with_options(usagestr, options);
        }
@@@ -483,7 -494,7 +486,7 @@@ static int usage_argh(const struct opti
                        s = literal ? "[%s]" : "[<%s>]";
        else
                s = literal ? " %s" : " <%s>";
 -      return fprintf(outfile, s, opts->argh ? _(opts->argh) : _("..."));
 +      return utf8_fprintf(outfile, s, opts->argh ? _(opts->argh) : _("..."));
  }
  
  #define USAGE_OPTS_WIDTH 24
@@@ -542,7 -553,7 +545,7 @@@ static int usage_with_options_internal(
                if (opts->long_name)
                        pos += fprintf(outfile, "--%s", opts->long_name);
                if (opts->type == OPTION_NUMBER)
 -                      pos += fprintf(outfile, "-NUM");
 +                      pos += utf8_fprintf(outfile, _("-NUM"));
  
                if ((opts->flags & PARSE_OPT_LITERAL_ARGHELP) ||
                    !(opts->flags & PARSE_OPT_NOARG))
@@@ -586,12 -597,3 +589,12 @@@ static int parse_options_usage(struct p
        return usage_with_options_internal(ctx, usagestr, opts, 0, err);
  }
  
 +#undef opterror
 +int opterror(const struct option *opt, const char *reason, int flags)
 +{
 +      if (flags & OPT_SHORT)
 +              return error("switch `%c' %s", opt->short_name, reason);
 +      if (flags & OPT_UNSET)
 +              return error("option `no-%s' %s", opt->long_name, reason);
 +      return error("option `%s' %s", opt->long_name, reason);
 +}