X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=sidebyside;f=rev-list.c;h=6b35b61ec25136c0c7249d217e2f47f663da3199;hb=9de48752fedc4923502c522af0e1f5b94c5fea2e;hp=897a0e7ad84b8e42e498770717d9ca05cca19e63;hpb=51b1e1713b1ed8e962e994cd0850ea439ad8c3de;p=git.git diff --git a/rev-list.c b/rev-list.c index 897a0e7a..6b35b61e 100644 --- a/rev-list.c +++ b/rev-list.c @@ -1,5 +1,7 @@ #include "cache.h" #include "commit.h" +#include "tree.h" +#include "blob.h" #include "epoch.h" #define SEEN (1u << 0) @@ -17,6 +19,8 @@ static const char rev_list_usage[] = " --merge-order [ --show-breaks ]"; static int bisect_list = 0; +static int tree_objects = 0; +static int blob_objects = 0; static int verbose_header = 0; static int show_parents = 0; static int hdr_termination = 0; @@ -27,6 +31,7 @@ static int max_count = -1; static enum cmit_fmt commit_format = CMIT_FMT_RAW; static int merge_order = 0; static int show_breaks = 0; +static int stop_traversal = 0; static void show_commit(struct commit *commit) { @@ -57,12 +62,20 @@ static void show_commit(struct commit *commit) static int filter_commit(struct commit * commit) { + if (merge_order && stop_traversal && commit->object.flags & BOUNDARY) + return STOP; if (commit->object.flags & (UNINTERESTING|SHOWN)) return CONTINUE; if (min_age != -1 && (commit->date > min_age)) return CONTINUE; - if (max_age != -1 && (commit->date < max_age)) - return STOP; + if (max_age != -1 && (commit->date < max_age)) { + if (!merge_order) + return STOP; + else { + stop_traversal = 1; + return CONTINUE; + } + } if (max_count != -1 && !max_count--) return STOP; return DO; @@ -85,20 +98,102 @@ static int process_commit(struct commit * commit) return CONTINUE; } +static struct object_list **add_object(struct object *obj, struct object_list **p) +{ + struct object_list *entry = xmalloc(sizeof(*entry)); + entry->item = obj; + entry->next = NULL; + *p = entry; + return &entry->next; +} + +static struct object_list **process_blob(struct blob *blob, struct object_list **p) +{ + struct object *obj = &blob->object; + + if (!blob_objects) + return p; + if (obj->flags & (UNINTERESTING | SEEN)) + return p; + obj->flags |= SEEN; + return add_object(obj, p); +} + +static struct object_list **process_tree(struct tree *tree, struct object_list **p) +{ + struct object *obj = &tree->object; + struct tree_entry_list *entry; + + if (!tree_objects) + return p; + if (obj->flags & (UNINTERESTING | SEEN)) + return p; + if (parse_tree(tree) < 0) + die("bad tree object %s", sha1_to_hex(obj->sha1)); + obj->flags |= SEEN; + p = add_object(obj, p); + for (entry = tree->entries ; entry ; entry = entry->next) { + if (entry->directory) + p = process_tree(entry->item.tree, p); + else + p = process_blob(entry->item.blob, p); + } + return p; +} + static void show_commit_list(struct commit_list *list) { + struct object_list *objects = NULL, **p = &objects; while (list) { struct commit *commit = pop_most_recent_commit(&list, SEEN); + p = process_tree(commit->tree, p); if (process_commit(commit) == STOP) break; } + while (objects) { + puts(sha1_to_hex(objects->item->sha1)); + objects = objects->next; + } +} + +static void mark_blob_uninteresting(struct blob *blob) +{ + if (!blob_objects) + return; + if (blob->object.flags & UNINTERESTING) + return; + blob->object.flags |= UNINTERESTING; +} + +static void mark_tree_uninteresting(struct tree *tree) +{ + struct object *obj = &tree->object; + struct tree_entry_list *entry; + + if (!tree_objects) + return; + if (obj->flags & UNINTERESTING) + return; + obj->flags |= UNINTERESTING; + if (parse_tree(tree) < 0) + die("bad tree %s", sha1_to_hex(obj->sha1)); + entry = tree->entries; + while (entry) { + if (entry->directory) + mark_tree_uninteresting(entry->item.tree); + else + mark_blob_uninteresting(entry->item.blob); + entry = entry->next; + } } 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; @@ -267,6 +362,11 @@ int main(int argc, char **argv) bisect_list = 1; continue; } + if (!strcmp(arg, "--objects")) { + tree_objects = 1; + blob_objects = 1; + continue; + } if (!strncmp(arg, "--merge-order", 13)) { merge_order = 1; continue;