On Sun, 26 Feb 2006, Linus Torvalds wrote: > > I suspect that the simplest fix is to just move "limited" into the "revs" > structure, the way I did pretty much everything else. That way nothing > really changes: we'll have the exact same logic, the flag just moved > around. Here's a cleanup patch that does that. It also moves "unpacked" (and the flag parsing) into rev_info, since that actually does affect the revision walker too, and thus logically belongs there. If you prefer, I can generate a totally re-done patch that combines all the fixes so far. Linus ---- diff-tree d33c6e5017d52d36f8da44162c0d87899efd247c (from 4b0fd13e13f49fa73ddd03a69f7d2ad1109139d4) Author: Linus Torvalds <torvalds@xxxxxxxx> Date: Mon Feb 27 08:50:26 2006 -0800 Fix rev-list "limited" handling Also, move "unpacked" into the rev_info structure, where it logically belongs. Signed-off-by: Linus Torvalds <torvalds@xxxxxxxx> diff --git a/rev-list.c b/rev-list.c index e9e371c..2e80930 100644 --- a/rev-list.c +++ b/rev-list.c @@ -41,7 +41,6 @@ static const char rev_list_usage[] = struct rev_info revs; -static int unpacked = 0; static int bisect_list = 0; static int verbose_header = 0; static int abbrev = DEFAULT_ABBREV; @@ -572,7 +571,7 @@ static struct commit_list *limit_list(st if (revs.max_age != -1 && (commit->date < revs.max_age)) obj->flags |= UNINTERESTING; - if (unpacked && has_sha1_pack(obj->sha1)) + if (revs.unpacked && has_sha1_pack(obj->sha1)) obj->flags |= UNINTERESTING; add_parents_to_list(commit, &list); if (obj->flags & UNINTERESTING) { @@ -595,7 +594,7 @@ static struct commit_list *limit_list(st int main(int argc, const char **argv) { struct commit_list *list; - int i, limited = 0; + int i; argc = setup_revisions(argc, argv, &revs); @@ -655,11 +654,6 @@ int main(int argc, const char **argv) bisect_list = 1; continue; } - if (!strcmp(arg, "--unpacked")) { - unpacked = 1; - limited = 1; - continue; - } if (!strcmp(arg, "--merge-order")) { merge_order = 1; continue; @@ -673,34 +667,25 @@ int main(int argc, const char **argv) } list = revs.commits; - if (list && list->next) - limited = 1; - - if (revs.topo_order) - limited = 1; if (!list && (!(revs.tag_objects||revs.tree_objects||revs.blob_objects) && !revs.pending_objects)) usage(rev_list_usage); - if (revs.paths) { - limited = 1; + if (revs.paths) diff_tree_setup_paths(revs.paths); - } - if (revs.max_age || revs.min_age) - limited = 1; save_commit_buffer = verbose_header; track_object_refs = 0; if (!merge_order) { sort_by_date(&list); - if (list && !limited && revs.max_count == 1 && + if (list && !revs.limited && revs.max_count == 1 && !revs.tag_objects && !revs.tree_objects && !revs.blob_objects) { show_commit(list->item); return 0; } - if (limited) + if (revs.limited) list = limit_list(list); if (revs.topo_order) sort_in_topological_order(&list, revs.lifo); diff --git a/revision.c b/revision.c index 17dbf9a..0422593 100644 --- a/revision.c +++ b/revision.c @@ -143,8 +143,10 @@ static struct commit *get_commit_referen object->flags |= flags; if (parse_commit(commit) < 0) die("unable to parse commit %s", name); - if (flags & UNINTERESTING) + if (flags & UNINTERESTING) { mark_parents_uninteresting(commit); + revs->limited = 1; + } return commit; } @@ -255,10 +257,12 @@ int setup_revisions(int argc, const char } if (!strncmp(arg, "--max-age=", 10)) { revs->max_age = atoi(arg + 10); + revs->limited = 1; continue; } if (!strncmp(arg, "--min-age=", 10)) { revs->min_age = atoi(arg + 10); + revs->limited = 1; continue; } if (!strcmp(arg, "--all")) { @@ -277,11 +281,13 @@ int setup_revisions(int argc, const char } if (!strcmp(arg, "--topo-order")) { revs->topo_order = 1; + revs->limited = 1; continue; } if (!strcmp(arg, "--date-order")) { revs->lifo = 0; revs->topo_order = 1; + revs->limited = 1; continue; } if (!strcmp(arg, "--dense")) { @@ -309,6 +315,11 @@ int setup_revisions(int argc, const char revs->edge_hint = 1; continue; } + if (!strcmp(arg, "--unpacked")) { + revs->unpacked = 1; + revs->limited = 1; + continue; + } *unrecognized++ = arg; left++; continue; @@ -365,6 +376,8 @@ int setup_revisions(int argc, const char commit = get_commit_reference(revs, def, sha1, 0); add_one_commit(commit, revs); } + if (revs->paths) + revs->limited = 1; *unrecognized = NULL; return left; } diff --git a/revision.h b/revision.h index 5170ac4..a22f198 100644 --- a/revision.h +++ b/revision.h @@ -21,7 +21,9 @@ struct rev_info { tag_objects:1, tree_objects:1, blob_objects:1, - edge_hint:1; + edge_hint:1, + limited:1, + unpacked:1; /* special limits */ int max_count; - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html