Move "--parent" parsing into generic revision.c library code
[git.git] / revision.c
index abc8745..1224a2d 100644 (file)
@@ -420,24 +420,33 @@ static void limit_list(struct rev_info *revs)
                p = &commit_list_insert(commit, p)->next;
        }
        if (revs->boundary) {
-               list = newlist;
-               while (list) {
+               /* mark the ones that are on the result list first */
+               for (list = newlist; list; list = list->next) {
+                       struct commit *commit = list->item;
+                       commit->object.flags |= TMP_MARK;
+               }
+               for (list = newlist; list; list = list->next) {
                        struct commit *commit = list->item;
                        struct object *obj = &commit->object;
-                       struct commit_list *parent = commit->parents;
-                       if (obj->flags & (UNINTERESTING|BOUNDARY)) {
-                               list = list->next;
+                       struct commit_list *parent;
+                       if (obj->flags & UNINTERESTING)
                                continue;
-                       }
-                       while (parent) {
+                       for (parent = commit->parents;
+                            parent;
+                            parent = parent->next) {
                                struct commit *pcommit = parent->item;
-                               parent = parent->next;
                                if (!(pcommit->object.flags & UNINTERESTING))
                                        continue;
                                pcommit->object.flags |= BOUNDARY;
+                               if (pcommit->object.flags & TMP_MARK)
+                                       continue;
+                               pcommit->object.flags |= TMP_MARK;
                                p = &commit_list_insert(pcommit, p)->next;
                        }
-                       list = list->next;
+               }
+               for (list = newlist; list; list = list->next) {
+                       struct commit *commit = list->item;
+                       commit->object.flags &= ~TMP_MARK;
                }
        }
        revs->commits = newlist;
@@ -596,6 +605,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
                                revs->limited = 1;
                                continue;
                        }
+                       if (!strcmp(arg, "--parents")) {
+                               revs->parents = 1;
+                               continue;
+                       }
                        if (!strcmp(arg, "--dense")) {
                                revs->dense = 1;
                                continue;