X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git.c;h=78ed403ed121a84c3efe3a57fa7c24486d724953;hb=dfdcb558ecf93c0e09b8dab89cff4839e8c95e36;hp=b4a1ef2bc85a79cd0d6f7c8fe3ed0eba9fd1f062;hpb=12d81ce59846e17676c5534257ca2f1783829d63;p=git.git diff --git a/git.c b/git.c index b4a1ef2b..78ed403e 100644 --- a/git.c +++ b/git.c @@ -15,7 +15,9 @@ #include "cache.h" #include "commit.h" +#include "diff.h" #include "revision.h" +#include "log-tree.h" #ifndef PATH_MAX # define PATH_MAX 4096 @@ -283,8 +285,14 @@ static int cmd_log(int argc, const char **argv, char **envp) 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]; @@ -296,6 +304,12 @@ static int cmd_log(int argc, const char **argv, char **envp) 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) @@ -303,16 +317,51 @@ static int cmd_log(int argc, const char **argv, char **envp) else if (40 < abbrev) abbrev = 40; } - else + 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); + } + argc--; argv++; } + 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); + } + prepare_revision_walk(&rev); setup_pager(); while ((commit = get_revision(&rev)) != NULL) { - printf("%s%s", commit_prefix, - sha1_to_hex(commit->object.sha1)); + if (shown && do_diff && commit_format != CMIT_FMT_ONELINE) + putchar('\n'); + fputs(commit_prefix, stdout); + if (abbrev_commit && abbrev) + fputs(find_unique_abbrev(commit->object.sha1, abbrev), + stdout); + else + fputs(sha1_to_hex(commit->object.sha1), stdout); if (rev.parents) { struct commit_list *parents = commit->parents; while (parents) { @@ -339,6 +388,11 @@ static int cmd_log(int argc, const char **argv, char **envp) pretty_print_commit(commit_format, commit, ~0, buf, LOGSIZE, abbrev); printf("%s\n", buf); + if (do_diff) + log_tree_commit(&opt, commit); + shown = 1; + free(commit->buffer); + commit->buffer = NULL; } free(buf); return 0;