sha1-lookup: make selection of 'middle' less aggressive
[gitweb.git] / builtin-rev-list.c
index 0258ec43f96cfd20c06125a905c08227729c7249..edc0bd35bb0e96a230284250dc4c40776cf7caac 100644 (file)
@@ -25,10 +25,15 @@ static const char rev_list_usage[] =
 "    --no-merges\n"
 "    --remove-empty\n"
 "    --all\n"
+"    --branches\n"
+"    --tags\n"
+"    --remotes\n"
 "    --stdin\n"
+"    --quiet\n"
 "  ordering output:\n"
 "    --topo-order\n"
 "    --date-order\n"
+"    --reverse\n"
 "  formatting output:\n"
 "    --parents\n"
 "    --objects | --objects-edge\n"
@@ -50,6 +55,7 @@ static int show_timestamp;
 static int hdr_termination;
 static const char *header_prefix;
 
+static void finish_commit(struct commit *commit);
 static void show_commit(struct commit *commit)
 {
        if (show_timestamp)
@@ -58,6 +64,8 @@ static void show_commit(struct commit *commit)
                fputs(header_prefix, stdout);
        if (commit->object.flags & BOUNDARY)
                putchar('-');
+       else if (commit->object.flags & UNINTERESTING)
+               putchar('^');
        else if (revs.left_right) {
                if (commit->object.flags & SYMMETRIC_LEFT)
                        putchar('<');
@@ -82,7 +90,7 @@ static void show_commit(struct commit *commit)
        else
                putchar('\n');
 
-       if (revs.verbose_header) {
+       if (revs.verbose_header && commit->buffer) {
                struct strbuf buf;
                strbuf_init(&buf, 0);
                pretty_print_commit(revs.commit_format, commit,
@@ -93,6 +101,11 @@ static void show_commit(struct commit *commit)
                strbuf_release(&buf);
        }
        maybe_flush_or_die(stdout, "stdout");
+       finish_commit(commit);
+}
+
+static void finish_commit(struct commit *commit)
+{
        if (commit->parents) {
                free_commit_list(commit->parents);
                commit->parents = NULL;
@@ -101,6 +114,12 @@ static void show_commit(struct commit *commit)
        commit->buffer = NULL;
 }
 
+static void finish_object(struct object_array_entry *p)
+{
+       if (p->item->type == OBJ_BLOB && !has_sha1_file(p->item->sha1))
+               die("missing blob object '%s'", sha1_to_hex(p->item->sha1));
+}
+
 static void show_object(struct object_array_entry *p)
 {
        /* An object with name "foo\n0000000..." can be used to
@@ -108,9 +127,7 @@ static void show_object(struct object_array_entry *p)
         */
        const char *ep = strchr(p->name, '\n');
 
-       if (p->item->type == OBJ_BLOB && !has_sha1_file(p->item->sha1))
-               die("missing blob object '%s'", sha1_to_hex(p->item->sha1));
-
+       finish_object(p);
        if (ep) {
                printf("%s %.*s\n", sha1_to_hex(p->item->sha1),
                       (int) (ep - p->name),
@@ -509,7 +526,7 @@ static void read_revisions_from_stdin(struct rev_info *revs)
 
        while (fgets(line, sizeof(line), stdin) != NULL) {
                int len = strlen(line);
-               if (line[len - 1] == '\n')
+               if (len && line[len - 1] == '\n')
                        line[--len] = 0;
                if (!len)
                        break;
@@ -527,6 +544,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
        int read_from_stdin = 0;
        int bisect_show_vars = 0;
        int bisect_find_all = 0;
+       int quiet = 0;
 
        git_config(git_default_config);
        init_revisions(&revs, prefix);
@@ -565,6 +583,10 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
                        read_revisions_from_stdin(&revs);
                        continue;
                }
+               if (!strcmp(arg, "--quiet")) {
+                       quiet = 1;
+                       continue;
+               }
                usage(rev_list_usage);
 
        }
@@ -589,11 +611,11 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
                usage(rev_list_usage);
 
        save_commit_buffer = revs.verbose_header || revs.grep_filter;
-       track_object_refs = 0;
        if (bisect_list)
                revs.limited = 1;
 
-       prepare_revision_walk(&revs);
+       if (prepare_revision_walk(&revs))
+               die("revision walk setup failed");
        if (revs.tree_objects)
                mark_edges_uninteresting(revs.commits, &revs, show_edge);
 
@@ -640,7 +662,9 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
                }
        }
 
-       traverse_commit_list(&revs, show_commit, show_object);
+       traverse_commit_list(&revs,
+               quiet ? finish_commit : show_commit,
+               quiet ? finish_object : show_object);
 
        return 0;
 }