[PATCH] Require less in RPM spec
[git.git] / rev-list.c
index 1a03bf7..c410bc3 100644 (file)
@@ -33,7 +33,7 @@ static int blob_objects = 0;
 static int verbose_header = 0;
 static int show_parents = 0;
 static int hdr_termination = 0;
-static const char *prefix = "";
+static const char *commit_prefix = "";
 static unsigned long max_age = -1;
 static unsigned long min_age = -1;
 static int max_count = -1;
@@ -48,14 +48,14 @@ static void show_commit(struct commit *commit)
 {
        commit->object.flags |= SHOWN;
        if (show_breaks) {
-               prefix = "| ";
+               commit_prefix = "| ";
                if (commit->object.flags & DISCONTINUITY) {
-                       prefix = "^ ";     
+                       commit_prefix = "^ ";     
                } else if (commit->object.flags & BOUNDARY) {
-                       prefix = "= ";
+                       commit_prefix = "= ";
                } 
         }                      
-       printf("%s%s", prefix, sha1_to_hex(commit->object.sha1));
+       printf("%s%s", commit_prefix, sha1_to_hex(commit->object.sha1));
        if (show_parents) {
                struct commit_list *parents = commit->parents;
                while (parents) {
@@ -63,7 +63,11 @@ static void show_commit(struct commit *commit)
                        parents = parents->next;
                }
        }
-       putchar('\n');
+       if (commit_format == CMIT_FMT_ONELINE)
+               putchar(' ');
+       else
+               putchar('\n');
+
        if (verbose_header) {
                static char pretty_header[16384];
                pretty_print_commit(commit_format, commit->buffer, ~0, pretty_header, sizeof(pretty_header));
@@ -227,8 +231,6 @@ static void mark_parents_uninteresting(struct commit *commit)
 {
        struct commit_list *parents = commit->parents;
 
-       if (tree_objects)
-               mark_tree_uninteresting(commit->tree);
        while (parents) {
                struct commit *commit = parents->item;
                commit->object.flags |= UNINTERESTING;
@@ -268,29 +270,6 @@ static int everybody_uninteresting(struct commit_list *orig)
                        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;
 }
 
@@ -366,6 +345,19 @@ static struct commit_list *find_bisection(struct commit_list *list)
        return best;
 }
 
+static void mark_edges_uninteresting(struct commit_list *list)
+{
+       for ( ; list; list = list->next) {
+               struct commit_list *parents = list->item->parents;
+
+               for ( ; parents; parents = parents->next) {
+                       struct commit *commit = parents->item;
+                       if (commit->object.flags & UNINTERESTING)
+                               mark_tree_uninteresting(commit->tree);
+               }
+       }
+}
+
 static struct commit_list *limit_list(struct commit_list *list)
 {
        struct commit_list *newlist = NULL;
@@ -384,6 +376,8 @@ static struct commit_list *limit_list(struct commit_list *list)
                }
                p = &commit_list_insert(commit, p)->next;
        }
+       if (tree_objects)
+               mark_edges_uninteresting(newlist);
        if (bisect_list)
                newlist = find_bisection(newlist);
        return newlist;
@@ -414,6 +408,8 @@ static struct commit *get_commit_reference(const char *name, unsigned int flags)
                if (tag_objects && !(object->flags & UNINTERESTING))
                        add_pending_object(object, tag->tag);
                object = parse_object(tag->tagged->sha1);
+               if (!object)
+                       die("bad object %s", sha1_to_hex(tag->tagged->sha1));
        }
 
        /*
@@ -477,6 +473,7 @@ int main(int argc, char **argv)
        struct commit_list *list = NULL;
        int i, limited = 0;
 
+       setup_git_directory();
        for (i = 1 ; i < argc; i++) {
                int flags;
                char *arg = argv[i];
@@ -503,7 +500,10 @@ int main(int argc, char **argv)
                        commit_format = get_commit_format(arg+8);
                        verbose_header = 1;
                        hdr_termination = '\n';
-                       prefix = "commit ";
+                       if (commit_format == CMIT_FMT_ONELINE)
+                               commit_prefix = "";
+                       else
+                               commit_prefix = "commit ";
                        continue;
                }
                if (!strncmp(arg, "--no-merges", 11)) {
@@ -572,6 +572,8 @@ int main(int argc, char **argv)
                handle_one_commit(commit, &list);
        }
 
+       save_commit_buffer = verbose_header;
+
        if (!merge_order) {             
                sort_by_date(&list);
                if (limited)