Merge branch 'jc/maint-log-merge-left-right'
authorJunio C Hamano <gitster@pobox.com>
Sun, 2 Mar 2008 23:12:04 +0000 (15:12 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 2 Mar 2008 23:12:04 +0000 (15:12 -0800)
* jc/maint-log-merge-left-right:
Fix "git log --merge --left-right"

1  2 
revision.c
diff --combined revision.c
index 0eb6faa5378ebafe2c4939cb4ec7fd2e6aaadb02,a399f27144bbabe3ee942408cdb90398990c3c85..63bf2c5c2dd314cfff2f54f76c4f5fd85b3b207e
@@@ -46,8 -46,6 +46,8 @@@ void add_object(struct object *obj
  
  static void mark_blob_uninteresting(struct blob *blob)
  {
 +      if (!blob)
 +              return;
        if (blob->object.flags & UNINTERESTING)
                return;
        blob->object.flags |= UNINTERESTING;
@@@ -59,8 -57,6 +59,8 @@@ void mark_tree_uninteresting(struct tre
        struct name_entry entry;
        struct object *obj = &tree->object;
  
 +      if (!tree)
 +              return;
        if (obj->flags & UNINTERESTING)
                return;
        obj->flags |= UNINTERESTING;
@@@ -177,8 -173,6 +177,8 @@@ static struct commit *handle_commit(str
                struct tag *tag = (struct tag *) object;
                if (revs->tag_objects && !(flags & UNINTERESTING))
                        add_pending_object(revs, object, tag->tag);
 +              if (!tag->tagged)
 +                      die("bad tag");
                object = parse_object(tag->tagged->sha1);
                if (!object)
                        die("bad object %s", sha1_to_hex(tag->tagged->sha1));
@@@ -564,12 -558,6 +564,12 @@@ static void cherry_pick_list(struct com
        free_patch_ids(&ids);
  }
  
 +static void add_to_list(struct commit_list **p, struct commit *commit, struct commit_list *n)
 +{
 +      p = &commit_list_insert(commit, p)->next;
 +      *p = n;
 +}
 +
  static int limit_list(struct rev_info *revs)
  {
        struct commit_list *list = revs->commits;
                        return -1;
                if (obj->flags & UNINTERESTING) {
                        mark_parents_uninteresting(commit);
 -                      if (everybody_uninteresting(list))
 +                      if (everybody_uninteresting(list)) {
 +                              if (revs->show_all)
 +                                      add_to_list(p, commit, list);
                                break;
 -                      continue;
 +                      }
 +                      if (!revs->show_all)
 +                              continue;
                }
                if (revs->min_age != -1 && (commit->date > revs->min_age))
                        continue;
@@@ -633,13 -617,12 +633,13 @@@ static int handle_one_ref(const char *p
        return 0;
  }
  
 -static void handle_all(struct rev_info *revs, unsigned flags)
 +static void handle_refs(struct rev_info *revs, unsigned flags,
 +              int (*for_each)(each_ref_fn, void *))
  {
        struct all_refs_cb cb;
        cb.all_revs = revs;
        cb.all_flags = flags;
 -      for_each_ref(handle_one_ref, &cb);
 +      for_each(handle_one_ref, &cb);
  }
  
  static void handle_one_reflog_commit(unsigned char *sha1, void *cb_data)
@@@ -702,8 -685,6 +702,8 @@@ static int add_parents_only(struct rev_
                it = get_reference(revs, arg, sha1, 0);
                if (it->type != OBJ_TAG)
                        break;
 +              if (!((struct tag*)it)->tagged)
 +                      return 0;
                hashcpy(sha1, ((struct tag*)it)->tagged->sha1);
        }
        if (it->type != OBJ_COMMIT)
@@@ -739,10 -720,6 +739,10 @@@ void init_revisions(struct rev_info *re
        revs->commit_format = CMIT_FMT_DEFAULT;
  
        diff_setup(&revs->diffopt);
 +      if (prefix && !revs->diffopt.prefix) {
 +              revs->diffopt.prefix = prefix;
 +              revs->diffopt.prefix_length = strlen(prefix);
 +      }
  }
  
  static void add_pending_commit_list(struct rev_info *revs,
@@@ -772,14 -749,9 +772,9 @@@ static void prepare_show_merge(struct r
        add_pending_object(revs, &head->object, "HEAD");
        add_pending_object(revs, &other->object, "MERGE_HEAD");
        bases = get_merge_bases(head, other, 1);
-       while (bases) {
-               struct commit *it = bases->item;
-               struct commit_list *n = bases->next;
-               free(bases);
-               bases = n;
-               it->object.flags |= UNINTERESTING;
-               add_pending_object(revs, &it->object, "(merge-base)");
-       }
+       add_pending_commit_list(revs, bases, UNINTERESTING);
+       free_commit_list(bases);
+       head->object.flags |= SYMMETRIC_LEFT;
  
        if (!active_nr)
                read_cache();
                        i++;
        }
        revs->prune_data = prune;
+       revs->limited = 1;
  }
  
  int handle_revision_arg(const char *arg, struct rev_info *revs,
@@@ -947,7 -920,6 +943,7 @@@ int setup_revisions(int argc, const cha
        int left = 1;
        int all_match = 0;
        int regflags = 0;
 +      int fixed = 0;
  
        /* First, search for "--" */
        seen_dashdash = 0;
                                continue;
                        }
                        if (!strcmp(arg, "--all")) {
 -                              handle_all(revs, flags);
 +                              handle_refs(revs, flags, for_each_ref);
 +                              continue;
 +                      }
 +                      if (!strcmp(arg, "--branches")) {
 +                              handle_refs(revs, flags, for_each_branch_ref);
 +                              continue;
 +                      }
 +                      if (!strcmp(arg, "--tags")) {
 +                              handle_refs(revs, flags, for_each_tag_ref);
 +                              continue;
 +                      }
 +                      if (!strcmp(arg, "--remotes")) {
 +                              handle_refs(revs, flags, for_each_remote_ref);
                                continue;
                        }
                        if (!strcmp(arg, "--first-parent")) {
                                revs->dense = 0;
                                continue;
                        }
 +                      if (!strcmp(arg, "--show-all")) {
 +                              revs->show_all = 1;
 +                              continue;
 +                      }
                        if (!strcmp(arg, "--remove-empty")) {
                                revs->remove_empty_trees = 1;
                                continue;
                                regflags |= REG_ICASE;
                                continue;
                        }
 +                      if (!strcmp(arg, "--fixed-strings") ||
 +                          !strcmp(arg, "-F")) {
 +                              fixed = 1;
 +                              continue;
 +                      }
                        if (!strcmp(arg, "--all-match")) {
                                all_match = 1;
                                continue;
                }
        }
  
 -      if (revs->grep_filter)
 +      if (revs->grep_filter) {
                revs->grep_filter->regflags |= regflags;
 +              revs->grep_filter->fixed = fixed;
 +      }
  
        if (show_merge)
                prepare_show_merge(revs);
@@@ -1485,8 -1434,6 +1481,8 @@@ enum commit_action simplify_commit(stru
                return commit_ignore;
        if (revs->unpacked && has_sha1_pack(commit->object.sha1, revs->ignore_packed))
                return commit_ignore;
 +      if (revs->show_all)
 +              return commit_show;
        if (commit->object.flags & UNINTERESTING)
                return commit_ignore;
        if (revs->min_age != -1 && (commit->date > revs->min_age))