[PATCH] Allow multiple date-ordered lists
authorDaniel Barkalow <barkalow@iabervon.org>
Sun, 24 Apr 2005 03:29:22 +0000 (20:29 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sun, 24 Apr 2005 03:29:22 +0000 (20:29 -0700)
Make pop_most_recent_commit() return the same objects multiple times, but only
if called with different bits to mark.

This is necessary to make merge-base work again.

Signed-Off-By: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
commit.c
commit.h
merge-base.c
rev-list.c

index 0243e77..2502688 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -114,7 +114,8 @@ void sort_by_date(struct commit_list **list)
        *list = ret;
 }
 
-struct commit *pop_most_recent_commit(struct commit_list **list)
+struct commit *pop_most_recent_commit(struct commit_list **list,
+                                     unsigned int mark)
 {
        struct commit *ret = (*list)->item;
        struct commit_list *parents = ret->parents;
@@ -125,8 +126,9 @@ struct commit *pop_most_recent_commit(struct commit_list **list)
 
        while (parents) {
                struct commit *commit = parents->item;
-               if (!commit->object.parsed) {
-                       parse_commit(commit);
+               parse_commit(commit);
+               if (!(commit->object.flags & mark)) {
+                       commit->object.flags |= mark;
                        insert_by_date(list, commit);
                }
                parents = parents->next;
index c8684d1..d61d084 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -31,6 +31,7 @@ void sort_by_date(struct commit_list **list);
 /** Removes the first commit from a list sorted by date, and adds all
  * of its parents.
  **/
-struct commit *pop_most_recent_commit(struct commit_list **list);
+struct commit *pop_most_recent_commit(struct commit_list **list, 
+                                     unsigned int mark);
 
 #endif /* COMMIT_H */
index 0e4c58e..2c40881 100644 (file)
@@ -6,29 +6,11 @@ static struct commit *process_list(struct commit_list **list_p, int this_mark,
                                   int other_mark)
 {
        struct commit *item = (*list_p)->item;
-       
-       if (item->object.flags & this_mark) {
-               /*
-                 printf("%d already seen %s %x\n",
-                 this_mark
-                 sha1_to_hex(posn->parent->sha1),
-                 posn->parent->flags);
-               */
-               /* do nothing; this indicates that this side
-                * split and reformed, and we only need to
-                * mark it once.
-                */
-               *list_p = (*list_p)->next;
-       } else if (item->object.flags & other_mark) {
+
+       if (item->object.flags & other_mark) {
                return item;
        } else {
-               /*
-                 printf("%d based on %s\n",
-                 this_mark,
-                 sha1_to_hex(posn->parent->sha1));
-               */
-               pop_most_recent_commit(list_p);
-               item->object.flags |= this_mark;
+               pop_most_recent_commit(list_p, this_mark);
        }
        return NULL;
 }
@@ -39,7 +21,9 @@ struct commit *common_ancestor(struct commit *rev1, struct commit *rev2)
        struct commit_list *rev2list = NULL;
 
        commit_list_insert(rev1, &rev1list);
+       rev1->object.flags |= 0x1;
        commit_list_insert(rev2, &rev2list);
+       rev2->object.flags |= 0x2;
 
        parse_commit(rev1);
        parse_commit(rev2);
index 1c797d2..77bfc29 100644 (file)
@@ -16,7 +16,7 @@ int main(int argc, char **argv)
 
        commit_list_insert(commit, &list);
        do {
-               struct commit *commit = pop_most_recent_commit(&list);
+               struct commit *commit = pop_most_recent_commit(&list, 0x1);
                printf("%s\n", sha1_to_hex(commit->object.sha1));
        } while (list);
        return 0;