Move "--parent" parsing into generic revision.c library code
[git.git] / revision.c
index 745b0d2..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;
@@ -641,15 +654,19 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
                dotdot = strstr(arg, "..");
                if (dotdot) {
                        unsigned char from_sha1[20];
-                       char *next = dotdot + 2;
+                       const char *next = dotdot + 2;
+                       const char *this = arg;
                        *dotdot = 0;
                        if (!*next)
                                next = "HEAD";
-                       if (!get_sha1(arg, from_sha1) && !get_sha1(next, sha1)) {
+                       if (dotdot == arg)
+                               this = "HEAD";
+                       if (!get_sha1(this, from_sha1) &&
+                           !get_sha1(next, sha1)) {
                                struct commit *exclude;
                                struct commit *include;
 
-                               exclude = get_commit_reference(revs, arg, from_sha1, flags ^ UNINTERESTING);
+                               exclude = get_commit_reference(revs, this, from_sha1, flags ^ UNINTERESTING);
                                include = get_commit_reference(revs, next, sha1, flags);
                                if (!exclude || !include)
                                        die("Invalid revision range %s..%s", arg, next);