Merge branch 'jb/per-user-exclude'
[gitweb.git] / revision.c
index 5d137ea14a6f73f2d2c487e1c8fe65b396b32cc4..3c2eb125e6e9332fe32be9bcec6fb2005228c211 100644 (file)
@@ -1227,7 +1227,6 @@ static struct commit *get_revision_1(struct rev_info *revs)
                        if (revs->parents)
                                rewrite_parents(revs, commit);
                }
-               commit->object.flags |= SHOWN;
                return commit;
        } while (revs->commits);
        return NULL;
@@ -1248,7 +1247,7 @@ static void gc_boundary(struct object_array *array)
                                objects[j] = objects[i];
                        j++;
                }
-               for (i = j; j < nr; j++)
+               for (i = j; i < nr; i++)
                        objects[i].item = NULL;
                array->nr = j;
        }
@@ -1280,22 +1279,36 @@ struct commit *get_revision(struct rev_info *revs)
        }
 
        if (revs->reverse) {
+               int limit = -1;
+
+               if (0 <= revs->max_count) {
+                       limit = revs->max_count;
+                       if (0 < revs->skip_count)
+                               limit += revs->skip_count;
+               }
                l = NULL;
-               while ((c = get_revision_1(revs)))
+               while ((c = get_revision_1(revs))) {
                        commit_list_insert(c, &l);
+                       if ((0 < limit) && !--limit)
+                               break;
+               }
                revs->commits = l;
                revs->reverse = 0;
+               revs->max_count = -1;
+               c = NULL;
        }
 
        /*
         * Now pick up what they want to give us
         */
        c = get_revision_1(revs);
-       while (0 < revs->skip_count) {
-               revs->skip_count--;
-               c = get_revision_1(revs);
-               if (!c)
-                       break;
+       if (c) {
+               while (0 < revs->skip_count) {
+                       revs->skip_count--;
+                       c = get_revision_1(revs);
+                       if (!c)
+                               break;
+               }
        }
 
        /*
@@ -1311,8 +1324,12 @@ struct commit *get_revision(struct rev_info *revs)
                revs->max_count--;
        }
 
-       if (!revs->boundary)
+       if (c)
+               c->object.flags |= SHOWN;
+
+       if (!revs->boundary) {
                return c;
+       }
 
        if (!c) {
                /*
@@ -1334,7 +1351,7 @@ struct commit *get_revision(struct rev_info *revs)
        for (l = c->parents; l; l = l->next) {
                struct object *p;
                p = &(l->item->object);
-               if (p->flags & CHILD_SHOWN)
+               if (p->flags & (CHILD_SHOWN | SHOWN))
                        continue;
                p->flags |= CHILD_SHOWN;
                gc_boundary(&revs->boundary_commits);