From f4235f8b2ef875b85ead74ffa199d827f9ee9d8d Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 15 Apr 2006 03:16:46 -0700 Subject: Extract "log [diff options]" parser out. Merging of the log-tree-opt structure with rev-info structure did not work out very well and it broke things that did not want diff options and/or rev options. This is an alternative approach to define a combined interface that can be used by commands that wants both. The use of it is opt-in to reduce the risk of breaking existing programs. We might want to slurp "setup_revisions() places things in pending objects list" part from Linus's earlier attempt. Signed-off-by: Junio C Hamano --- log-tree.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'log-tree.c') diff --git a/log-tree.c b/log-tree.c index 3d404824a1..cb0d0b15e7 100644 --- a/log-tree.c +++ b/log-tree.c @@ -173,3 +173,68 @@ int log_tree_commit(struct log_tree_opt *opt, struct commit *commit) } return 0; } + +int parse_whatchanged_opt(int ac, const char **av, struct whatchanged_opt *wcopt) +{ + struct rev_info *rev = &wcopt->revopt; + struct log_tree_opt *opt = &wcopt->logopt; + const char **unrecognized = av+1; + int left = 1; + + ac = setup_revisions(ac, av, rev, "HEAD"); + while (1 < ac) { + const char *arg = av[1]; + if (!strncmp(arg, "--pretty", 8)) { + opt->commit_format = get_commit_format(arg + 8); + } + else if (!strcmp(arg, "--no-abbrev")) { + wcopt->abbrev = 0; + } + else if (!strcmp(arg, "--abbrev")) { + wcopt->abbrev = DEFAULT_ABBREV; + } + else if (!strcmp(arg, "--abbrev-commit")) { + wcopt->abbrev_commit = 1; + } + else if (!strncmp(arg, "--abbrev=", 9)) { + wcopt->abbrev = strtoul(arg + 9, NULL, 10); + if (wcopt->abbrev && wcopt->abbrev < MINIMUM_ABBREV) + wcopt->abbrev = MINIMUM_ABBREV; + else if (40 < wcopt->abbrev) + wcopt->abbrev = 40; + } + else if (!strcmp(arg, "--full-diff")) { + wcopt->do_diff = 1; + wcopt->full_diff = 1; + } + else { + int cnt = log_tree_opt_parse(opt, av+1, ac-1); + if (0 < cnt) { + wcopt->do_diff = 1; + av += cnt; + ac -= cnt; + continue; + } + *unrecognized++ = arg; + left++; + } + ac--; av++; + } + + if (wcopt->do_diff) { + opt->diffopt.abbrev = wcopt->abbrev; + opt->verbose_header = 0; + opt->always_show_header = 0; + opt->no_commit_id = 1; + if (opt->combine_merges) + opt->ignore_merges = 0; + if (opt->dense_combined_merges) + opt->diffopt.output_format = DIFF_FORMAT_PATCH; + if (opt->diffopt.output_format == DIFF_FORMAT_PATCH) + opt->diffopt.recursive = 1; + if (!wcopt->full_diff && rev->prune_data) + diff_tree_setup_paths(rev->prune_data, &opt->diffopt); + diff_setup_done(&opt->diffopt); + } + return left; +} -- cgit v1.2.3