X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=revision.c;h=f2a9f25fe11f3883281ea5fdd783700056fd5c6e;hb=093b06889104d218e95251176af5cf4aa5dd5cdd;hp=bdf8005aec6428f274ad02af04366aaa5339bb18;hpb=8e8f998739db6526fe890fabc88c866759bc2ac3;p=git.git diff --git a/revision.c b/revision.c index bdf8005a..f2a9f25f 100644 --- a/revision.c +++ b/revision.c @@ -152,6 +152,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object if (parse_commit(commit) < 0) die("unable to parse commit %s", name); if (flags & UNINTERESTING) { + commit->object.flags |= UNINTERESTING; mark_parents_uninteresting(commit); revs->limited = 1; } @@ -380,6 +381,9 @@ static void add_parents_to_list(struct rev_info *revs, struct commit *commit, st if (revs->prune_fn) revs->prune_fn(revs, commit); + if (revs->no_walk) + return; + parent = commit->parents; while (parent) { struct commit *p = parent->item; @@ -475,11 +479,9 @@ static void handle_all(struct rev_info *revs, unsigned flags) void init_revisions(struct rev_info *revs) { - unsigned abbrev = revs->abbrev; - memset(revs, 0, sizeof(*revs)); - revs->abbrev = abbrev; + revs->abbrev = DEFAULT_ABBREV; revs->ignore_merges = 1; revs->pruning.recursive = 1; revs->pruning.add_remove = file_add_remove; @@ -497,7 +499,6 @@ void init_revisions(struct rev_info *revs) revs->topo_setter = topo_sort_default_setter; revs->topo_getter = topo_sort_default_getter; - revs->header_prefix = ""; revs->commit_format = CMIT_FMT_DEFAULT; diff_setup(&revs->diffopt); @@ -516,8 +517,6 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch const char **unrecognized = argv + 1; int left = 1; - init_revisions(revs); - /* First, search for "--" */ seen_dashdash = 0; for (i = 1; i < argc; i++) { @@ -676,12 +675,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch } if (!strcmp(arg, "-v")) { revs->verbose_header = 1; - revs->header_prefix = "diff-tree "; continue; } if (!strncmp(arg, "--pretty", 8)) { revs->verbose_header = 1; - revs->header_prefix = "diff-tree "; revs->commit_format = get_commit_format(arg+8); continue; } @@ -755,17 +752,15 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch arg++; } if (get_sha1(arg, sha1) < 0) { - struct stat st; int j; if (seen_dashdash || local_flags) die("bad revision '%s'", arg); /* 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", argv[j], strerror(errno)); - } + for (j = i; j < argc; j++) + verify_filename(revs->prefix, argv[j]); + revs->prune_data = get_pathspec(revs->prefix, argv + i); break; } @@ -792,11 +787,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch } if (revs->combine_merges) { revs->ignore_merges = 0; - if (revs->dense_combined_merges) + if (revs->dense_combined_merges && + (revs->diffopt.output_format != DIFF_FORMAT_DIFFSTAT)) revs->diffopt.output_format = DIFF_FORMAT_PATCH; } - if (revs->diffopt.output_format == DIFF_FORMAT_PATCH) - revs->diffopt.recursive = 1; revs->diffopt.abbrev = revs->abbrev; diff_setup_done(&revs->diffopt); @@ -820,6 +814,8 @@ void prepare_revision_walk(struct rev_info *revs) list = list->next; } + if (revs->no_walk) + return; if (revs->limited) limit_list(revs); if (revs->topo_order) @@ -855,6 +851,17 @@ static void rewrite_parents(struct rev_info *revs, struct commit *commit) } } +static void mark_boundary_to_show(struct commit *commit) +{ + struct commit_list *p = commit->parents; + while (p) { + commit = p->item; + p = p->next; + if (commit->object.flags & BOUNDARY) + commit->object.flags |= BOUNDARY_SHOW; + } +} + struct commit *get_revision(struct rev_info *revs) { struct commit_list *list = revs->commits; @@ -892,8 +899,20 @@ struct commit *get_revision(struct rev_info *revs) } if (commit->object.flags & SHOWN) continue; - if (!(commit->object.flags & BOUNDARY) && - (commit->object.flags & UNINTERESTING)) + + /* We want to show boundary commits only when their + * children are shown. When path-limiter is in effect, + * rewrite_parents() drops some commits from getting shown, + * and there is no point showing boundary parents that + * are not shown. After rewrite_parents() rewrites the + * parents of a commit that is shown, we mark the boundary + * parents with BOUNDARY_SHOW. + */ + if (commit->object.flags & BOUNDARY_SHOW) { + commit->object.flags |= SHOWN; + return commit; + } + if (commit->object.flags & UNINTERESTING) continue; if (revs->min_age != -1 && (commit->date > revs->min_age)) continue; @@ -906,6 +925,8 @@ struct commit *get_revision(struct rev_info *revs) if (revs->parents) rewrite_parents(revs, commit); } + if (revs->boundary) + mark_boundary_to_show(commit); commit->object.flags |= SHOWN; return commit; } while (revs->commits);