X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=revision.c;h=abc874584e94399d262cd9b31dd2c8e601056cdc;hb=e464f4c3119b04712ab87329f3dd4d4f21b0a8a7;hp=12cd0529a5dfac9af01af0f47e895e9cf142c42a;hpb=f2cb4004fd5b3ec4b11ad8ee6a374a55e9292732;p=git.git diff --git a/revision.c b/revision.c index 12cd0529..abc87458 100644 --- a/revision.c +++ b/revision.c @@ -419,6 +419,27 @@ static void limit_list(struct rev_info *revs) continue; p = &commit_list_insert(commit, p)->next; } + if (revs->boundary) { + list = newlist; + while (list) { + struct commit *commit = list->item; + struct object *obj = &commit->object; + struct commit_list *parent = commit->parents; + if (obj->flags & (UNINTERESTING|BOUNDARY)) { + list = list->next; + continue; + } + while (parent) { + struct commit *pcommit = parent->item; + parent = parent->next; + if (!(pcommit->object.flags & UNINTERESTING)) + continue; + pcommit->object.flags |= BOUNDARY; + p = &commit_list_insert(pcommit, p)->next; + } + list = list->next; + } + } revs->commits = newlist; } @@ -587,10 +608,14 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch revs->remove_empty_trees = 1; continue; } - if (!strncmp(arg, "--no-merges", 11)) { + if (!strcmp(arg, "--no-merges")) { 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 +641,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); @@ -649,7 +678,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch /* If we didn't have a "--", all filenames must exist */ for (j = i; j < argc; j++) { if (lstat(argv[j], &st) < 0) - die("'%s': %s", arg, strerror(errno)); + die("'%s': %s", argv[j], strerror(errno)); } revs->prune_data = get_pathspec(revs->prefix, argv + i); break; @@ -731,13 +760,17 @@ struct commit *get_revision(struct rev_info *revs) do { struct commit *commit = revs->commits->item; - if (commit->object.flags & (UNINTERESTING|SHOWN)) + if (commit->object.flags & SHOWN) + goto next; + if (!(commit->object.flags & BOUNDARY) && + (commit->object.flags & UNINTERESTING)) goto next; if (revs->min_age != -1 && (commit->date > revs->min_age)) goto next; if (revs->max_age != -1 && (commit->date < revs->max_age)) return NULL; - if (revs->no_merges && commit->parents && commit->parents->next) + if (revs->no_merges && + commit->parents && commit->parents->next) goto next; if (revs->prune_fn && revs->dense) { if (!(commit->object.flags & TREECHANGE)) @@ -745,8 +778,19 @@ struct commit *get_revision(struct rev_info *revs) rewrite_parents(commit); } /* More to go? */ - if (revs->max_count) - pop_most_recent_commit(&revs->commits, SEEN); + 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); + } commit->object.flags |= SHOWN; return commit; next: