Merge branch 'en/rev-parse-invalid-range'
authorJunio C Hamano <gitster@pobox.com>
Fri, 1 Jun 2018 06:06:39 +0000 (15:06 +0900)
committerJunio C Hamano <gitster@pobox.com>
Fri, 1 Jun 2018 06:06:39 +0000 (15:06 +0900)
"git rev-parse Y..." etc. misbehaved when given endpoints were
not committishes.

* en/rev-parse-invalid-range:
rev-parse: check lookup'ed commit references for NULL

1  2 
builtin/rev-parse.c
diff --combined builtin/rev-parse.c
index 55c0b904410dd4bc12420ff0cb95042d697940fe,da5748bdaef376f35fdb49125e959474913c6ad9..4f49e96bfd0166aeb6f9875a688ff0dd83d631b5
@@@ -159,7 -159,7 +159,7 @@@ static void show_rev(int type, const st
                }
        }
        else if (abbrev)
 -              show_with_type(type, find_unique_abbrev(oid->hash, abbrev));
 +              show_with_type(type, find_unique_abbrev(oid, abbrev));
        else
                show_with_type(type, oid_to_hex(oid));
  }
@@@ -243,28 -243,28 +243,28 @@@ static int show_file(const char *arg, i
  static int try_difference(const char *arg)
  {
        char *dotdot;
 -      struct object_id oid;
 -      struct object_id end;
 -      const char *next;
 -      const char *this;
 +      struct object_id start_oid;
 +      struct object_id end_oid;
 +      const char *end;
 +      const char *start;
        int symmetric;
        static const char head_by_default[] = "HEAD";
  
        if (!(dotdot = strstr(arg, "..")))
                return 0;
 -      next = dotdot + 2;
 -      this = arg;
 -      symmetric = (*next == '.');
 +      end = dotdot + 2;
 +      start = arg;
 +      symmetric = (*end == '.');
  
        *dotdot = 0;
 -      next += symmetric;
 +      end += symmetric;
  
 -      if (!*next)
 -              next = head_by_default;
 +      if (!*end)
 +              end = head_by_default;
        if (dotdot == arg)
 -              this = head_by_default;
 +              start = head_by_default;
  
 -      if (this == head_by_default && next == head_by_default &&
 +      if (start == head_by_default && end == head_by_default &&
            !symmetric) {
                /*
                 * Just ".."?  That is not a range but the
                return 0;
        }
  
 -      if (!get_oid_committish(this, &oid) && !get_oid_committish(next, &end)) {
 -              show_rev(NORMAL, &end, next);
 -              show_rev(symmetric ? NORMAL : REVERSED, &oid, this);
 +      if (!get_oid_committish(start, &start_oid) && !get_oid_committish(end, &end_oid)) {
 +              show_rev(NORMAL, &end_oid, end);
 +              show_rev(symmetric ? NORMAL : REVERSED, &start_oid, start);
                if (symmetric) {
                        struct commit_list *exclude;
                        struct commit *a, *b;
 -                      a = lookup_commit_reference(&oid);
 -                      b = lookup_commit_reference(&end);
 +                      a = lookup_commit_reference(&start_oid);
 +                      b = lookup_commit_reference(&end_oid);
+                       if (!a || !b) {
+                               *dotdot = '.';
+                               return 0;
+                       }
                        exclude = get_merge_bases(a, b);
                        while (exclude) {
                                struct commit *commit = pop_commit(&exclude);
@@@ -328,12 -332,12 +332,12 @@@ static int try_parent_shorthands(const 
                return 0;
  
        *dotdot = 0;
-       if (get_oid_committish(arg, &oid)) {
+       if (get_oid_committish(arg, &oid) ||
+           !(commit = lookup_commit_reference(&oid))) {
                *dotdot = '^';
                return 0;
        }
  
-       commit = lookup_commit_reference(&oid);
        if (exclude_parent &&
            exclude_parent > commit_list_count(commit->parents)) {
                *dotdot = '^';
@@@ -516,7 -520,7 +520,7 @@@ static int cmd_parseopt(int argc, cons
                        PARSE_OPT_SHELL_EVAL);
  
        strbuf_addstr(&parsed, " --");
 -      sq_quote_argv(&parsed, argv, 0);
 +      sq_quote_argv(&parsed, argv);
        puts(parsed.buf);
        return 0;
  }
@@@ -526,7 -530,7 +530,7 @@@ static int cmd_sq_quote(int argc, cons
        struct strbuf buf = STRBUF_INIT;
  
        if (argc)
 -              sq_quote_argv(&buf, argv, 0);
 +              sq_quote_argv(&buf, argv);
        printf("%s\n", buf.buf);
        strbuf_release(&buf);
  
@@@ -887,8 -891,8 +891,8 @@@ int cmd_rev_parse(int argc, const char 
                                if (read_cache() < 0)
                                        die(_("Could not read the index"));
                                if (the_index.split_index) {
 -                                      const unsigned char *sha1 = the_index.split_index->base_sha1;
 -                                      const char *path = git_path("sharedindex.%s", sha1_to_hex(sha1));
 +                                      const struct object_id *oid = &the_index.split_index->base_oid;
 +                                      const char *path = git_path("sharedindex.%s", oid_to_hex(oid));
                                        strbuf_reset(&buf);
                                        puts(relative_path(path, prefix, &buf));
                                }