summaryrefslogtreecommitdiff
path: root/log-tree.c
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <junkio@cox.net>2006-04-15 03:16:46 -0700
committerLibravatar Junio C Hamano <junkio@cox.net>2006-04-15 03:24:33 -0700
commitf4235f8b2ef875b85ead74ffa199d827f9ee9d8d (patch)
tree9805f85029ac2c0a392c00e8a2e7a7be1e252933 /log-tree.c
parentdiff-tree: typefix. (diff)
downloadtgif-f4235f8b2ef875b85ead74ffa199d827f9ee9d8d.tar.xz
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 <junkio@cox.net>
Diffstat (limited to 'log-tree.c')
-rw-r--r--log-tree.c65
1 files changed, 65 insertions, 0 deletions
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;
+}