Typofix: usage strings fix.
[git.git] / rev-list.c
index 0c0bdc2..309070f 100644 (file)
@@ -11,7 +11,7 @@
 #define SHOWN          (1u << 3)
 
 static const char rev_list_usage[] =
-       "usage: git-rev-list [OPTION] commit-id <commit-id>\n"
+       "git-rev-list [OPTION] commit-id <commit-id>\n"
                      "  --max-count=nr\n"
                      "  --max-age=epoch\n"
                      "  --min-age=epoch\n"
@@ -241,8 +241,9 @@ static void mark_parents_uninteresting(struct commit *commit)
        }
 }
 
-static int everybody_uninteresting(struct commit_list *list)
+static int everybody_uninteresting(struct commit_list *orig)
 {
+       struct commit_list *list = orig;
        while (list) {
                struct commit *commit = list->item;
                list = list->next;
@@ -250,6 +251,29 @@ static int everybody_uninteresting(struct commit_list *list)
                        continue;
                return 0;
        }
+
+       /*
+        * Ok, go back and mark all the edge trees uninteresting,
+        * since otherwise we can have situations where a parent
+        * that was marked uninteresting (and we never even had
+        * to look at) had lots of objects that we don't want to
+        * include.
+        *
+        * NOTE! This still doesn't mean that the object list is
+        * "correct", since we may end up listing objects that
+        * even older commits (that we don't list) do actually
+        * reference, but it gets us to a minimal list (or very
+        * close) in practice.
+        */
+       if (!tree_objects)
+               return 1;
+
+       while (orig) {
+               struct commit *commit = orig->item;
+               if (!parse_commit(commit) && commit->tree)
+                       mark_tree_uninteresting(commit->tree);
+               orig = orig->next;
+       }
        return 1;
 }
 
@@ -367,12 +391,12 @@ static struct commit *get_commit_reference(const char *name, unsigned int flags)
        /*
         * Tag object? Look what it points to..
         */
-       if (object->type == tag_type) {
+       while (object->type == tag_type) {
                struct tag *tag = (struct tag *) object;
                object->flags |= flags;
                if (tag_objects && !(object->flags & UNINTERESTING))
                        add_pending_object(object, tag->tag);
-               object = tag->tagged;
+               object = parse_object(tag->tagged->sha1);
        }
 
        /*