Merge branch 'bc/rev-parse-parseopt-fix' into next
authorJunio C Hamano <gitster@pobox.com>
Sun, 24 Sep 2017 10:39:40 +0000 (19:39 +0900)
committerJunio C Hamano <gitster@pobox.com>
Sun, 24 Sep 2017 10:39:40 +0000 (19:39 +0900)
Recent versions of "git rev-parse --parseopt" did not parse the
option specification that does not have the optional flags (*=?!)
correctly, which has been corrected.

* bc/rev-parse-parseopt-fix:
git-rebase: don't ignore unexpected command line arguments
rev-parse parseopt: interpret any whitespace as start of help text
rev-parse parseopt: do not search help text for flag chars
t1502: demonstrate rev-parse --parseopt option mis-parsing

1  2 
builtin/rev-parse.c
git-rebase.sh
diff --combined builtin/rev-parse.c
index 9f24004c0a310d22808c86ab6ee65e6b296fe70c,b3f634d20912124d0bf51d0a8eb4031919d20700..37f4209c24e7ffd296fe6ddf81afddc4683c81fc
@@@ -274,7 -274,7 +274,7 @@@ static int try_difference(const char *a
                return 0;
        }
  
 -      if (!get_sha1_committish(this, oid.hash) && !get_sha1_committish(next, end.hash)) {
 +      if (!get_oid_committish(this, &oid) && !get_oid_committish(next, &end)) {
                show_rev(NORMAL, &end, next);
                show_rev(symmetric ? NORMAL : REVERSED, &oid, this);
                if (symmetric) {
@@@ -328,7 -328,7 +328,7 @@@ static int try_parent_shorthands(const 
                return 0;
  
        *dotdot = 0;
 -      if (get_sha1_committish(arg, oid.hash)) {
 +      if (get_oid_committish(arg, &oid)) {
                *dotdot = '^';
                return 0;
        }
@@@ -387,6 -387,14 +387,14 @@@ static const char *skipspaces(const cha
        return s;
  }
  
+ static char *findspace(const char *s)
+ {
+       for (; *s; s++)
+               if (isspace(*s))
+                       return (char*)s;
+       return NULL;
+ }
  static int cmd_parseopt(int argc, const char **argv, const char *prefix)
  {
        static int keep_dashdash = 0, stop_at_non_option = 0;
        /* parse: (<short>|<short>,<long>|<long>)[*=?!]*<arghint>? SP+ <help> */
        while (strbuf_getline(&sb, stdin) != EOF) {
                const char *s;
-               const char *help;
+               char *help;
                struct option *o;
  
                if (!sb.len)
                memset(opts + onb, 0, sizeof(opts[onb]));
  
                o = &opts[onb++];
-               help = strchr(sb.buf, ' ');
-               if (!help || *sb.buf == ' ') {
+               help = findspace(sb.buf);
+               if (!help || sb.buf == help) {
                        o->type = OPTION_GROUP;
                        o->help = xstrdup(skipspaces(sb.buf));
                        continue;
                }
  
+               *help = '\0';
                o->type = OPTION_CALLBACK;
-               o->help = xstrdup(skipspaces(help));
+               o->help = xstrdup(skipspaces(help+1));
                o->value = &parsed;
                o->flags = PARSE_OPT_NOARG;
                o->callback = &parseopt_dump;
@@@ -702,7 -712,7 +712,7 @@@ int cmd_rev_parse(int argc, const char 
                        }
                        if (!strcmp(arg, "--quiet") || !strcmp(arg, "-q")) {
                                quiet = 1;
 -                              flags |= GET_SHA1_QUIETLY;
 +                              flags |= GET_OID_QUIETLY;
                                continue;
                        }
                        if (opt_with_value(arg, "--short", &arg)) {
                                continue;
                        }
                        if (!strcmp(arg, "--bisect")) {
 -                              for_each_ref_in("refs/bisect/bad", show_reference, NULL);
 -                              for_each_ref_in("refs/bisect/good", anti_reference, NULL);
 +                              for_each_fullref_in("refs/bisect/bad", show_reference, NULL, 0);
 +                              for_each_fullref_in("refs/bisect/good", anti_reference, NULL, 0);
                                continue;
                        }
                        if (opt_with_value(arg, "--branches", &arg)) {
                        name++;
                        type = REVERSED;
                }
 -              if (!get_sha1_with_context(name, flags, oid.hash, &unused)) {
 +              if (!get_oid_with_context(name, flags, &oid, &unused)) {
                        if (verify)
                                revs_count++;
                        else
diff --combined git-rebase.sh
index ad8415e3cf6907044b0730b59fc2e6ff30ab7174,45f187bdbfee23a3ebd99fb2efb42ba893d13963..6344e8d5e38ca237dc5b5b67844f87f48aaa74ca
@@@ -55,10 -55,9 +55,10 @@@ LF=
  '
  ok_to_skip_pre_rebase=
  resolvemsg="
 -$(gettext 'When you have resolved this problem, run "git rebase --continue".
 -If you prefer to skip this patch, run "git rebase --skip" instead.
 -To check out the original branch and stop rebasing, run "git rebase --abort".')
 +$(gettext 'Resolve all conflicts manually, mark them as resolved with
 +"git add/rm <conflicted_files>", then run "git rebase --continue".
 +You can instead skip this commit: run "git rebase --skip".
 +To abort and get back to the state before "git rebase", run "git rebase --abort".')
  "
  unset onto
  unset restrict_revision
@@@ -74,7 -73,6 +74,7 @@@ test "$(git config --bool rebase.stat)
  autostash="$(git config --bool rebase.autostash || echo false)"
  fork_point=auto
  git_am_opt=
 +git_format_patch_opt=
  rebase_root=
  force_rebase=
  allow_rerere_autoupdate=
@@@ -350,6 -348,9 +350,9 @@@ d
                shift
                break
                ;;
+       *)
+               usage
+               ;;
        esac
        shift
  done
@@@ -446,11 -447,6 +449,11 @@@ els
        state_dir="$apply_dir"
  fi
  
 +if test -t 2 && test -z "$GIT_QUIET"
 +then
 +      git_format_patch_opt="$git_format_patch_opt --progress"
 +fi
 +
  if test -z "$rebase_root"
  then
        case "$#" in