There are three struct pathspec(s) in struct rev_info: - prune_data - pruning.pathspec - diffopt.pathspec In some places, this pathspec is used, in other places another one. I'd like to have only one pathspec in struct rev_info, but i'm not sure why diffopt can't be used in place of pruning. So in the meantime, prune_data will be gone. The driving force behind this is now diff_options.pathspec can be manipulated behind the scene by diff_setup_done() to support --exclude. Rev machinery does not know about this and does not need to. Remove prune_data in favor of diffopt.pathspec, handing complex pathspec manipulation to diff machinery. As part of the changes, setup_revisions() now can take pathspecs directly by setting argc = 0, argv = pathspec Signed-off-by: Nguyán ThÃi Ngác Duy <pclouds@xxxxxxxxx> --- builtin/add.c | 3 +-- builtin/diff.c | 6 +++--- builtin/fast-export.c | 2 +- diff-lib.c | 6 +++--- revision.c | 20 +++++++++++--------- revision.h | 1 - wt-status.c | 6 ++---- 7 files changed, 21 insertions(+), 23 deletions(-) diff --git a/builtin/add.c b/builtin/add.c index f7a17e4..904db6b 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -85,8 +85,7 @@ int add_files_to_cache(const char *prefix, const char **pathspec, int flags) struct update_callback_data data; struct rev_info rev; init_revisions(&rev, prefix); - setup_revisions(0, NULL, &rev, NULL); - init_pathspec(&rev.prune_data, pathspec); + setup_revisions(0, pathspec, &rev, NULL); rev.diffopt.output_format = DIFF_FORMAT_CALLBACK; rev.diffopt.format_callback = update_callback; data.flags = flags; diff --git a/builtin/diff.c b/builtin/diff.c index 4c9deb2..1c69da2 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -374,10 +374,10 @@ int cmd_diff(int argc, const char **argv, const char *prefix) } die("unhandled object '%s' given.", name); } - if (rev.prune_data.nr) { + if (rev.diffopt.pathspec.nr) { if (!path) - path = rev.prune_data.items[0].match; - paths += rev.prune_data.nr; + path = rev.diffopt.pathspec.items[0].match; + paths += rev.diffopt.pathspec.nr; } /* diff --git a/builtin/fast-export.c b/builtin/fast-export.c index daf1945..b225427 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -651,7 +651,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix) if (import_filename) import_marks(import_filename); - if (import_filename && revs.prune_data.nr) + if (import_filename && revs.diffopt.pathspec.nr) full_tree = 1; get_tags_and_duplicates(&revs.pending, &extra_refs); diff --git a/diff-lib.c b/diff-lib.c index 1e22992..b3ac269 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -106,7 +106,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option) DIFF_OPT_TST(&revs->diffopt, HAS_CHANGES)) break; - if (!ce_path_match(ce, &revs->prune_data)) + if (!ce_path_match(ce, &revs->diffopt.pathspec)) continue; if (ce_stage(ce)) { @@ -427,7 +427,7 @@ static int oneway_diff(struct cache_entry **src, struct unpack_trees_options *o) if (tree == o->df_conflict_entry) tree = NULL; - if (ce_path_match(idx ? idx : tree, &revs->prune_data)) + if (ce_path_match(idx ? idx : tree, &revs->diffopt.pathspec)) do_oneway_diff(o, idx, tree); return 0; @@ -501,7 +501,7 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt) active_nr = dst - active_cache; init_revisions(&revs, NULL); - init_pathspec(&revs.prune_data, opt->pathspec.raw); + init_pathspec(&revs.diffopt.pathspec, opt->pathspec.raw); tree = parse_tree_indirect(tree_sha1); if (!tree) die("bad tree object %s", sha1_to_hex(tree_sha1)); diff --git a/revision.c b/revision.c index 86d2470..f9f66de 100644 --- a/revision.c +++ b/revision.c @@ -323,7 +323,7 @@ static int rev_compare_tree(struct rev_info *revs, struct commit *parent, struct * tagged commit by specifying both --simplify-by-decoration * and pathspec. */ - if (!revs->prune_data.nr) + if (!revs->diffopt.pathspec.nr) return REV_TREE_SAME; } @@ -969,7 +969,7 @@ static void prepare_show_merge(struct rev_info *revs) struct cache_entry *ce = active_cache[i]; if (!ce_stage(ce)) continue; - if (ce_path_match(ce, &revs->prune_data)) { + if (ce_path_match(ce, &revs->diffopt.pathspec)) { prune_num++; prune = xrealloc(prune, sizeof(*prune) * prune_num); prune[prune_num-2] = ce->name; @@ -979,8 +979,8 @@ static void prepare_show_merge(struct rev_info *revs) ce_same_name(ce, active_cache[i+1])) i++; } - free_pathspec(&revs->prune_data); - init_pathspec(&revs->prune_data, prune); + free_pathspec(&revs->diffopt.pathspec); + init_pathspec(&revs->diffopt.pathspec, prune); revs->limited = 1; } @@ -1488,6 +1488,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s if (opt) submodule = opt->submodule; + /* argv is a list of pathspec */ + if (!argc && argv) + prune_data = argv; + /* First, search for "--" */ seen_dashdash = 0; for (i = 1; i < argc; i++) { @@ -1617,7 +1621,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s } if (prune_data) - init_pathspec(&revs->prune_data, get_pathspec(revs->prefix, prune_data)); + init_pathspec(&revs->diffopt.pathspec, get_pathspec(revs->prefix, prune_data)); if (revs->def == NULL) revs->def = opt ? opt->def : NULL; @@ -1648,19 +1652,17 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s if (revs->topo_order) revs->limited = 1; - if (revs->prune_data.nr) { - diff_tree_setup_paths(revs->prune_data.raw, &revs->pruning); + if (revs->diffopt.pathspec.nr) { /* Can't prune commits with rename following: the paths change.. */ if (!DIFF_OPT_TST(&revs->diffopt, FOLLOW_RENAMES)) revs->prune = 1; - if (!revs->full_diff) - diff_tree_setup_paths(revs->prune_data.raw, &revs->diffopt); } if (revs->combine_merges) revs->ignore_merges = 0; revs->diffopt.abbrev = revs->abbrev; if (diff_setup_done(&revs->diffopt) < 0) die("diff_setup_done failed"); + diff_tree_setup_paths(revs->diffopt.pathspec.raw, &revs->pruning); compile_grep_patterns(&revs->grep_filter); diff --git a/revision.h b/revision.h index 82509dd..066e407 100644 --- a/revision.h +++ b/revision.h @@ -34,7 +34,6 @@ struct rev_info { /* Basic information */ const char *prefix; const char *def; - struct pathspec prune_data; unsigned int early_output; /* Traversal flags */ diff --git a/wt-status.c b/wt-status.c index a82b11d..7c4171e 100644 --- a/wt-status.c +++ b/wt-status.c @@ -312,7 +312,7 @@ static void wt_status_collect_changes_worktree(struct wt_status *s) struct rev_info rev; init_revisions(&rev, NULL); - setup_revisions(0, NULL, &rev, NULL); + setup_revisions(0, s->pathspec, &rev, NULL); rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK; DIFF_OPT_SET(&rev.diffopt, DIRTY_SUBMODULES); if (!s->show_untracked_files) @@ -323,7 +323,6 @@ static void wt_status_collect_changes_worktree(struct wt_status *s) } rev.diffopt.format_callback = wt_status_collect_changed_cb; rev.diffopt.format_callback_data = s; - init_pathspec(&rev.prune_data, s->pathspec); run_diff_files(&rev, 0); } @@ -335,7 +334,7 @@ static void wt_status_collect_changes_index(struct wt_status *s) init_revisions(&rev, NULL); memset(&opt, 0, sizeof(opt)); opt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference; - setup_revisions(0, NULL, &rev, &opt); + setup_revisions(0, s->pathspec, &rev, &opt); if (s->ignore_submodule_arg) { DIFF_OPT_SET(&rev.diffopt, OVERRIDE_SUBMODULE_CONFIG); @@ -348,7 +347,6 @@ static void wt_status_collect_changes_index(struct wt_status *s) rev.diffopt.detect_rename = 1; rev.diffopt.rename_limit = 200; rev.diffopt.break_opt = 0; - init_pathspec(&rev.prune_data, s->pathspec); run_diff_index(&rev, 1); } -- 1.7.3.1.256.g2539c.dirty -- To unsubscribe from this list: 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