[PATCH] Support for NO_OPENSSL
[git.git] / rev-list.c
index fdb531c..83a604a 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"
@@ -228,6 +228,17 @@ static void mark_parents_uninteresting(struct commit *commit)
                commit->object.flags |= UNINTERESTING;
 
                /*
+                * Normally we haven't parsed the parent
+                * yet, so we won't have a parent of a parent
+                * here. However, it may turn out that we've
+                * reached this commit some other way (where it
+                * wasn't uninteresting), in which case we need
+                * to mark its parents recursively too..
+                */
+               if (commit->parents)
+                       mark_parents_uninteresting(commit);
+
+               /*
                 * A missing commit is ok iff its parent is marked 
                 * uninteresting.
                 *
@@ -241,8 +252,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 +262,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;
 }
 
@@ -513,9 +548,13 @@ int main(int argc, char **argv)
                        sort_in_topological_order(&list);
                show_commit_list(list);
        } else {
+#ifndef NO_OPENSSL
                if (sort_list_in_merge_order(list, &process_commit)) {
-                         die("merge order sort failed\n");
+                       die("merge order sort failed\n");
                }
+#else
+               die("merge order sort unsupported, OpenSSL not linked");
+#endif
        }
 
        return 0;