X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=revision.c;h=728b6d111dd3e11de6f5a6a0baa940d54d621e6a;hb=23091e954c968282d4d9087da00f60c2f02aecc5;hp=1224a2de624047eebd24969852af6833dbea2874;hpb=7b0c996679e975b666fd27c922e1e0837b611c98;p=git.git diff --git a/revision.c b/revision.c index 1224a2de..728b6d11 100644 --- a/revision.c +++ b/revision.c @@ -552,32 +552,26 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch } 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 (!strncmp(arg, "--since=", 8)) { revs->max_age = approxidate(arg + 8); - revs->limited = 1; continue; } if (!strncmp(arg, "--after=", 8)) { revs->max_age = approxidate(arg + 8); - revs->limited = 1; + continue; + } + if (!strncmp(arg, "--min-age=", 10)) { + revs->min_age = atoi(arg + 10); continue; } if (!strncmp(arg, "--before=", 9)) { revs->min_age = approxidate(arg + 9); - revs->limited = 1; continue; } if (!strncmp(arg, "--until=", 8)) { revs->min_age = approxidate(arg + 8); - revs->limited = 1; continue; } if (!strcmp(arg, "--all")) { @@ -596,13 +590,11 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch } 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, "--parents")) { @@ -644,7 +636,6 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch } if (!strcmp(arg, "--unpacked")) { revs->unpacked = 1; - revs->limited = 1; continue; } *unrecognized++ = arg; @@ -708,10 +699,19 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch add_one_commit(commit, revs); } + if (revs->topo_order || revs->unpacked) + revs->limited = 1; + if (revs->prune_data) { diff_tree_setup_paths(revs->prune_data); revs->prune_fn = try_to_simplify_commit; - revs->limited = 1; + + /* + * If we fix up parent data, we currently cannot + * do that on-the-fly. + */ + if (revs->parents) + revs->limited = 1; } return left; @@ -773,41 +773,39 @@ struct commit *get_revision(struct rev_info *revs) do { struct commit *commit = revs->commits->item; + revs->commits = revs->commits->next; + + /* + * If we haven't done the list limiting, we need to look at + * the parents here. We also need to do the date-based limiting + * that we'd otherwise have done in limit_list(). + */ + if (!revs->limited) { + if ((revs->unpacked && + has_sha1_pack(commit->object.sha1)) || + (revs->max_age != -1 && + (commit->date < revs->max_age))) + continue; + add_parents_to_list(revs, commit, &revs->commits); + } if (commit->object.flags & SHOWN) - goto next; + continue; if (!(commit->object.flags & BOUNDARY) && (commit->object.flags & UNINTERESTING)) - goto next; + continue; if (revs->min_age != -1 && (commit->date > revs->min_age)) - goto next; - if (revs->max_age != -1 && (commit->date < revs->max_age)) - return NULL; + continue; if (revs->no_merges && commit->parents && commit->parents->next) - goto next; + continue; if (revs->prune_fn && revs->dense) { if (!(commit->object.flags & TREECHANGE)) - goto next; - rewrite_parents(commit); - } - /* More to go? */ - if (revs->max_count) { - if (commit->object.flags & BOUNDARY) { - /* this is already uninteresting, - * so there is no point popping its - * parents into the list. - */ - struct commit_list *it = revs->commits; - revs->commits = it->next; - free(it); - } - else - pop_most_recent_commit(&revs->commits, SEEN); + continue; + if (revs->parents) + rewrite_parents(commit); } commit->object.flags |= SHOWN; return commit; -next: - pop_most_recent_commit(&revs->commits, SEEN); } while (revs->commits); return NULL; }