X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=revision.c;h=a8a54b658029606839853daf1cee380833486dd4;hb=2a0925be3512451834ec9a3e023f4cff23c1cfb7;hp=d7678cfab4b18082bacee706cb119018b39643a0;hpb=5cdeae71ea7330c08cf96b581e2c7696949e3840;p=git.git diff --git a/revision.c b/revision.c index d7678cfa..a8a54b65 100644 --- a/revision.c +++ b/revision.c @@ -419,6 +419,36 @@ static void limit_list(struct rev_info *revs) continue; p = &commit_list_insert(commit, p)->next; } + if (revs->boundary) { + /* mark the ones that are on the result list first */ + for (list = newlist; list; list = list->next) { + struct commit *commit = list->item; + commit->object.flags |= TMP_MARK; + } + for (list = newlist; list; list = list->next) { + struct commit *commit = list->item; + struct object *obj = &commit->object; + struct commit_list *parent; + if (obj->flags & UNINTERESTING) + continue; + for (parent = commit->parents; + parent; + parent = parent->next) { + struct commit *pcommit = parent->item; + if (!(pcommit->object.flags & UNINTERESTING)) + continue; + pcommit->object.flags |= BOUNDARY; + if (pcommit->object.flags & TMP_MARK) + continue; + pcommit->object.flags |= TMP_MARK; + p = &commit_list_insert(pcommit, p)->next; + } + } + for (list = newlist; list; list = list->next) { + struct commit *commit = list->item; + commit->object.flags &= ~TMP_MARK; + } + } revs->commits = newlist; } @@ -575,6 +605,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch revs->limited = 1; continue; } + if (!strcmp(arg, "--parents")) { + revs->parents = 1; + continue; + } if (!strcmp(arg, "--dense")) { revs->dense = 1; continue; @@ -591,6 +625,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch revs->no_merges = 1; continue; } + if (!strcmp(arg, "--boundary")) { + revs->boundary = 1; + continue; + } if (!strcmp(arg, "--objects")) { revs->tag_objects = 1; revs->tree_objects = 1; @@ -616,15 +654,19 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch dotdot = strstr(arg, ".."); if (dotdot) { unsigned char from_sha1[20]; - char *next = dotdot + 2; + const char *next = dotdot + 2; + const char *this = arg; *dotdot = 0; if (!*next) next = "HEAD"; - if (!get_sha1(arg, from_sha1) && !get_sha1(next, sha1)) { + if (dotdot == arg) + this = "HEAD"; + if (!get_sha1(this, from_sha1) && + !get_sha1(next, sha1)) { struct commit *exclude; struct commit *include; - exclude = get_commit_reference(revs, arg, from_sha1, flags ^ UNINTERESTING); + exclude = get_commit_reference(revs, this, from_sha1, flags ^ UNINTERESTING); include = get_commit_reference(revs, next, sha1, flags); if (!exclude || !include) die("Invalid revision range %s..%s", arg, next); @@ -669,7 +711,13 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch 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; @@ -731,26 +779,34 @@ struct commit *get_revision(struct rev_info *revs) do { struct commit *commit = revs->commits->item; - if (commit->object.flags & (UNINTERESTING|SHOWN)) - goto next; + revs->commits = revs->commits->next; + + /* + * If we haven't done the list limiting, we need to look at + * the parents here + */ + if (!revs->limited) + add_parents_to_list(revs, commit, &revs->commits); + if (commit->object.flags & SHOWN) + continue; + if (!(commit->object.flags & BOUNDARY) && + (commit->object.flags & UNINTERESTING)) + continue; if (revs->min_age != -1 && (commit->date > revs->min_age)) - goto next; + continue; if (revs->max_age != -1 && (commit->date < revs->max_age)) return NULL; - if (revs->no_merges && commit->parents && commit->parents->next) - goto next; + if (revs->no_merges && + commit->parents && commit->parents->next) + continue; if (revs->prune_fn && revs->dense) { if (!(commit->object.flags & TREECHANGE)) - goto next; - rewrite_parents(commit); + continue; + if (revs->parents) + rewrite_parents(commit); } - /* More to go? */ - if (revs->max_count) - pop_most_recent_commit(&revs->commits, SEEN); commit->object.flags |= SHOWN; return commit; -next: - pop_most_recent_commit(&revs->commits, SEEN); } while (revs->commits); return NULL; }