From: Junio C Hamano Date: Sun, 16 Apr 2006 02:35:55 +0000 (-0700) Subject: Merge branch 'js/diffstat' into next X-Git-Tag: v1.4.1-rc1~217 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/07512ea820b9161a1f45bb1bcc1bd67d6e1ea74f?hp=-c Merge branch 'js/diffstat' into next * js/diffstat: diff-options: add --patch-with-stat diff-files --stat: do not dump core with unmerged index. Support "git cmd --help" syntax diff --stat: do not do its own three-dashes. --- 07512ea820b9161a1f45bb1bcc1bd67d6e1ea74f diff --combined git.c index c87accfa1a,140ed1873d..2e0ae5e58e --- a/git.c +++ b/git.c @@@ -278,36 -278,91 +278,36 @@@ static int cmd_help(int argc, const cha #define LOGSIZE (65536) -static int cmd_log(int argc, const char **argv, char **envp) +static int cmd_log_wc(int argc, const char **argv, char **envp, + struct whatchanged_opt *wcopt) { - struct rev_info rev; struct commit *commit; char *buf = xmalloc(LOGSIZE); - static enum cmit_fmt commit_format = CMIT_FMT_DEFAULT; - int abbrev = DEFAULT_ABBREV; - int abbrev_commit = 0; const char *commit_prefix = "commit "; - struct log_tree_opt opt; int shown = 0; - int do_diff = 0; - int full_diff = 0; - - init_log_tree_opt(&opt); - argc = setup_revisions(argc, argv, &rev, "HEAD"); - while (1 < argc) { - const char *arg = argv[1]; - if (!strncmp(arg, "--pretty", 8)) { - commit_format = get_commit_format(arg + 8); - if (commit_format == CMIT_FMT_ONELINE) - commit_prefix = ""; - } - else if (!strcmp(arg, "--no-abbrev")) { - abbrev = 0; - } - else if (!strcmp(arg, "--abbrev")) { - abbrev = DEFAULT_ABBREV; - } - else if (!strcmp(arg, "--abbrev-commit")) { - abbrev_commit = 1; - } - else if (!strncmp(arg, "--abbrev=", 9)) { - abbrev = strtoul(arg + 9, NULL, 10); - if (abbrev && abbrev < MINIMUM_ABBREV) - abbrev = MINIMUM_ABBREV; - else if (40 < abbrev) - abbrev = 40; - } - else if (!strcmp(arg, "--full-diff")) { - do_diff = 1; - full_diff = 1; - } - else { - int cnt = log_tree_opt_parse(&opt, argv+1, argc-1); - if (0 < cnt) { - do_diff = 1; - argv += cnt; - argc -= cnt; - continue; - } - die("unrecognized argument: %s", arg); - } + struct rev_info *rev = &wcopt->revopt; + struct log_tree_opt *opt = &wcopt->logopt; - argc--; argv++; - } + opt->commit_format = CMIT_FMT_DEFAULT; + wcopt->abbrev = DEFAULT_ABBREV; + argc = parse_whatchanged_opt(argc, argv, wcopt); - if (do_diff) { - opt.diffopt.abbrev = 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 (!full_diff && rev.prune_data) - diff_tree_setup_paths(rev.prune_data, &opt.diffopt); - diff_setup_done(&opt.diffopt); - } + if (opt->commit_format == CMIT_FMT_ONELINE) + commit_prefix = ""; - prepare_revision_walk(&rev); + prepare_revision_walk(rev); setup_pager(); - while ((commit = get_revision(&rev)) != NULL) { - if (shown && do_diff && commit_format != CMIT_FMT_ONELINE) + while ((commit = get_revision(rev)) != NULL) { + if (shown && wcopt->do_diff && + opt->commit_format != CMIT_FMT_ONELINE) putchar('\n'); fputs(commit_prefix, stdout); - if (abbrev_commit && abbrev) - fputs(find_unique_abbrev(commit->object.sha1, abbrev), + if (wcopt->abbrev_commit && wcopt->abbrev) + fputs(find_unique_abbrev(commit->object.sha1, wcopt->abbrev), stdout); else fputs(sha1_to_hex(commit->object.sha1), stdout); - if (rev.parents) { + if (rev->parents) { struct commit_list *parents = commit->parents; while (parents) { struct object *o = &(parents->item->object); @@@ -326,15 -381,17 +326,17 @@@ parents = parents->next) parents->item->object.flags &= ~TMP_MARK; } - if (commit_format == CMIT_FMT_ONELINE) + if (opt->commit_format == CMIT_FMT_ONELINE) putchar(' '); else putchar('\n'); - pretty_print_commit(commit_format, commit, ~0, buf, - LOGSIZE, abbrev); + pretty_print_commit(opt->commit_format, commit, ~0, buf, + LOGSIZE, wcopt->abbrev); printf("%s\n", buf); - if (wcopt->do_diff) - if (do_diff) { ++ if (wcopt->do_diff) { + printf("---\n"); - log_tree_commit(&opt, commit); + log_tree_commit(opt, commit); + } shown = 1; free(commit->buffer); commit->buffer = NULL; @@@ -343,40 -400,6 +345,40 @@@ return 0; } +static int cmd_log(int ac, const char **av, char **ep) +{ + struct whatchanged_opt wcopt; + + memset(&wcopt, 0, sizeof(wcopt)); + init_log_tree_opt(&wcopt.logopt); + return cmd_log_wc(ac, av, ep, &wcopt); +} + +static int cmd_whatchanged(int ac, const char **av, char **ep) +{ + struct whatchanged_opt wcopt; + + memset(&wcopt, 0, sizeof(wcopt)); + wcopt.do_diff = 1; + init_log_tree_opt(&wcopt.logopt); + wcopt.logopt.diffopt.recursive = 1; + return cmd_log_wc(ac, av, ep, &wcopt); +} + +static int cmd_show(int ac, const char **av, char **ep) +{ + struct whatchanged_opt wcopt; + + memset(&wcopt, 0, sizeof(wcopt)); + wcopt.do_diff = 1; + init_log_tree_opt(&wcopt.logopt); + wcopt.logopt.ignore_merges = 0; + wcopt.logopt.combine_merges = 1; + wcopt.logopt.dense_combined_merges = 1; + wcopt.logopt.diffopt.recursive = 1; + return cmd_log_wc(ac, av, ep, &wcopt); +} + static void handle_internal_command(int argc, const char **argv, char **envp) { const char *cmd = argv[0]; @@@ -387,11 -410,15 +389,17 @@@ { "version", cmd_version }, { "help", cmd_help }, { "log", cmd_log }, + { "show", cmd_show }, + { "whatchanged", cmd_whatchanged }, }; int i; + /* Turn "git cmd --help" into "git help cmd" */ + if (argc > 1 && !strcmp(argv[1], "--help")) { + argv[1] = argv[0]; + argv[0] = cmd = "help"; + } + for (i = 0; i < ARRAY_SIZE(commands); i++) { struct cmd_struct *p = commands+i; if (strcmp(p->cmd, cmd))