Git fork
at reftables-rust 2617 lines 73 kB view raw
1/* 2 * Builtin "git log" and related commands (show, whatchanged) 3 * 4 * (C) Copyright 2006 Linus Torvalds 5 * 2006 Junio Hamano 6 */ 7 8#define USE_THE_REPOSITORY_VARIABLE 9 10#include "builtin.h" 11#include "abspath.h" 12#include "config.h" 13#include "environment.h" 14#include "gettext.h" 15#include "hex.h" 16#include "refs.h" 17#include "object-name.h" 18#include "odb.h" 19#include "pager.h" 20#include "color.h" 21#include "commit.h" 22#include "diff.h" 23#include "diff-merges.h" 24#include "revision.h" 25#include "log-tree.h" 26#include "builtin.h" 27#include "oid-array.h" 28#include "tag.h" 29#include "reflog-walk.h" 30#include "patch-ids.h" 31#include "path.h" 32#include "shortlog.h" 33#include "remote.h" 34#include "string-list.h" 35#include "parse-options.h" 36#include "line-log.h" 37#include "branch.h" 38#include "streaming.h" 39#include "version.h" 40#include "mailmap.h" 41#include "progress.h" 42#include "commit-slab.h" 43 44#include "commit-reach.h" 45#include "range-diff.h" 46#include "tmp-objdir.h" 47#include "tree.h" 48#include "write-or-die.h" 49 50#define MAIL_DEFAULT_WRAP 72 51#define COVER_FROM_AUTO_MAX_SUBJECT_LEN 100 52#define FORMAT_PATCH_NAME_MAX_DEFAULT 64 53 54static unsigned int force_in_body_from; 55static int stdout_mboxrd; 56static int format_no_prefix; 57 58static const char * const builtin_log_usage[] = { 59 N_("git log [<options>] [<revision-range>] [[--] <path>...]"), 60 N_("git show [<options>] <object>..."), 61 NULL 62}; 63 64struct line_opt_callback_data { 65 struct rev_info *rev; 66 const char *prefix; 67 struct string_list args; 68}; 69 70static int session_is_interactive(void) 71{ 72 return isatty(1) || pager_in_use(); 73} 74 75static int auto_decoration_style(void) 76{ 77 return session_is_interactive() ? DECORATE_SHORT_REFS : 0; 78} 79 80static int parse_decoration_style(const char *value) 81{ 82 switch (git_parse_maybe_bool(value)) { 83 case 1: 84 return DECORATE_SHORT_REFS; 85 case 0: 86 return 0; 87 default: 88 break; 89 } 90 if (!strcmp(value, "full")) 91 return DECORATE_FULL_REFS; 92 else if (!strcmp(value, "short")) 93 return DECORATE_SHORT_REFS; 94 else if (!strcmp(value, "auto")) 95 return auto_decoration_style(); 96 /* 97 * Please update _git_log() in git-completion.bash when you 98 * add new decoration styles. 99 */ 100 return -1; 101} 102 103struct log_config { 104 int default_abbrev_commit; 105 int default_show_root; 106 int default_follow; 107 int default_show_signature; 108 int default_encode_email_headers; 109 int decoration_style; 110 int decoration_given; 111 int use_mailmap_config; 112 char *fmt_patch_subject_prefix; 113 int fmt_patch_name_max; 114 char *fmt_pretty; 115 char *default_date_mode; 116 117#ifndef WITH_BREAKING_CHANGES 118 /* 119 * Note: git_log_config() does not touch this member and that 120 * is very deliberate. This member is only to be used to 121 * resurrect whatchanged that is deprecated. 122 */ 123 int i_still_use_this; 124#endif 125}; 126 127static void log_config_init(struct log_config *cfg) 128{ 129 memset(cfg, 0, sizeof(*cfg)); 130 cfg->default_show_root = 1; 131 cfg->default_encode_email_headers = 1; 132 cfg->use_mailmap_config = 1; 133 cfg->fmt_patch_subject_prefix = xstrdup("PATCH"); 134 cfg->fmt_patch_name_max = FORMAT_PATCH_NAME_MAX_DEFAULT; 135 cfg->decoration_style = auto_decoration_style(); 136} 137 138static void log_config_release(struct log_config *cfg) 139{ 140 free(cfg->default_date_mode); 141 free(cfg->fmt_pretty); 142 free(cfg->fmt_patch_subject_prefix); 143} 144 145static int use_default_decoration_filter = 1; 146static struct string_list decorate_refs_exclude = STRING_LIST_INIT_NODUP; 147static struct string_list decorate_refs_exclude_config = STRING_LIST_INIT_NODUP; 148static struct string_list decorate_refs_include = STRING_LIST_INIT_NODUP; 149 150static int clear_decorations_callback(const struct option *opt UNUSED, 151 const char *arg, int unset) 152{ 153 BUG_ON_OPT_NEG(unset); 154 BUG_ON_OPT_ARG(arg); 155 string_list_clear(&decorate_refs_include, 0); 156 string_list_clear(&decorate_refs_exclude, 0); 157 use_default_decoration_filter = 0; 158 return 0; 159} 160 161static int decorate_callback(const struct option *opt, const char *arg, 162 int unset) 163{ 164 struct log_config *cfg = opt->value; 165 166 if (unset) 167 cfg->decoration_style = 0; 168 else if (arg) 169 cfg->decoration_style = parse_decoration_style(arg); 170 else 171 cfg->decoration_style = DECORATE_SHORT_REFS; 172 173 if (cfg->decoration_style < 0) 174 die(_("invalid --decorate option: %s"), arg); 175 176 cfg->decoration_given = 1; 177 178 return 0; 179} 180 181static int log_line_range_callback(const struct option *option, const char *arg, int unset) 182{ 183 struct line_opt_callback_data *data = option->value; 184 185 BUG_ON_OPT_NEG(unset); 186 187 if (!arg) 188 return -1; 189 190 data->rev->line_level_traverse = 1; 191 string_list_append(&data->args, arg); 192 193 return 0; 194} 195 196static void cmd_log_init_defaults(struct rev_info *rev, 197 struct log_config *cfg) 198{ 199 if (cfg->fmt_pretty) 200 get_commit_format(cfg->fmt_pretty, rev); 201 if (cfg->default_follow) 202 rev->diffopt.flags.default_follow_renames = 1; 203 rev->verbose_header = 1; 204 init_diffstat_widths(&rev->diffopt); 205 rev->diffopt.flags.recursive = 1; 206 rev->diffopt.flags.allow_textconv = 1; 207 rev->abbrev_commit = cfg->default_abbrev_commit; 208 rev->show_root_diff = cfg->default_show_root; 209 rev->subject_prefix = cfg->fmt_patch_subject_prefix; 210 rev->patch_name_max = cfg->fmt_patch_name_max; 211 rev->show_signature = cfg->default_show_signature; 212 rev->encode_email_headers = cfg->default_encode_email_headers; 213 214 if (cfg->default_date_mode) 215 parse_date_format(cfg->default_date_mode, &rev->date_mode); 216} 217 218static void set_default_decoration_filter(struct decoration_filter *decoration_filter) 219{ 220 char *value = NULL; 221 struct string_list *include = decoration_filter->include_ref_pattern; 222 const struct string_list *config_exclude; 223 224 if (!repo_config_get_string_multi(the_repository, "log.excludeDecoration", 225 &config_exclude)) { 226 struct string_list_item *item; 227 for_each_string_list_item(item, config_exclude) 228 string_list_append(decoration_filter->exclude_ref_config_pattern, 229 item->string); 230 } 231 232 /* 233 * By default, decorate_all is disabled. Enable it if 234 * log.initialDecorationSet=all. Don't ever disable it by config, 235 * since the command-line takes precedent. 236 */ 237 if (use_default_decoration_filter && 238 !repo_config_get_string(the_repository, "log.initialdecorationset", &value) && 239 !strcmp("all", value)) 240 use_default_decoration_filter = 0; 241 free(value); 242 243 if (!use_default_decoration_filter || 244 decoration_filter->exclude_ref_pattern->nr || 245 decoration_filter->include_ref_pattern->nr || 246 decoration_filter->exclude_ref_config_pattern->nr) 247 return; 248 249 /* 250 * No command-line or config options were given, so 251 * populate with sensible defaults. 252 */ 253 for (size_t i = 0; i < ARRAY_SIZE(ref_namespace); i++) { 254 if (!ref_namespace[i].decoration) 255 continue; 256 257 string_list_append(include, ref_namespace[i].ref); 258 } 259} 260 261static void cmd_log_init_finish(int argc, const char **argv, const char *prefix, 262 struct rev_info *rev, struct setup_revision_opt *opt, 263 struct log_config *cfg) 264{ 265 struct userformat_want w; 266 int quiet = 0, source = 0, mailmap; 267 static struct line_opt_callback_data line_cb = {NULL, NULL, STRING_LIST_INIT_DUP}; 268 struct decoration_filter decoration_filter = { 269 .exclude_ref_pattern = &decorate_refs_exclude, 270 .include_ref_pattern = &decorate_refs_include, 271 .exclude_ref_config_pattern = &decorate_refs_exclude_config, 272 }; 273 static struct revision_sources revision_sources; 274 275 const struct option builtin_log_options[] = { 276 OPT__QUIET(&quiet, N_("suppress diff output")), 277 OPT_BOOL(0, "source", &source, N_("show source")), 278 OPT_BOOL(0, "use-mailmap", &mailmap, N_("use mail map file")), 279#ifndef WITH_BREAKING_CHANGES 280 OPT_HIDDEN_BOOL(0, "i-still-use-this", &cfg->i_still_use_this, 281 "<use this deprecated command>"), 282#endif 283 OPT_ALIAS(0, "mailmap", "use-mailmap"), 284 OPT_CALLBACK_F(0, "clear-decorations", NULL, NULL, 285 N_("clear all previously-defined decoration filters"), 286 PARSE_OPT_NOARG | PARSE_OPT_NONEG, 287 clear_decorations_callback), 288 OPT_STRING_LIST(0, "decorate-refs", &decorate_refs_include, 289 N_("pattern"), N_("only decorate refs that match <pattern>")), 290 OPT_STRING_LIST(0, "decorate-refs-exclude", &decorate_refs_exclude, 291 N_("pattern"), N_("do not decorate refs that match <pattern>")), 292 OPT_CALLBACK_F(0, "decorate", cfg, NULL, N_("decorate options"), 293 PARSE_OPT_OPTARG, decorate_callback), 294 OPT_CALLBACK('L', NULL, &line_cb, "range:file", 295 N_("trace the evolution of line range <start>,<end> or function :<funcname> in <file>"), 296 log_line_range_callback), 297 OPT_END() 298 }; 299 300 line_cb.rev = rev; 301 line_cb.prefix = prefix; 302 303 mailmap = cfg->use_mailmap_config; 304 argc = parse_options(argc, argv, prefix, 305 builtin_log_options, builtin_log_usage, 306 PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT | 307 PARSE_OPT_KEEP_DASHDASH); 308 309 if (quiet) 310 rev->diffopt.output_format |= DIFF_FORMAT_NO_OUTPUT; 311 argc = setup_revisions(argc, argv, rev, opt); 312 313 /* Any arguments at this point are not recognized */ 314 if (argc > 1) 315 die(_("unrecognized argument: %s"), argv[1]); 316 317 if (rev->line_level_traverse && rev->prune_data.nr) 318 die(_("-L<range>:<file> cannot be used with pathspec")); 319 320 memset(&w, 0, sizeof(w)); 321 userformat_find_requirements(NULL, &w); 322 323 if (!rev->show_notes_given && (!rev->pretty_given || w.notes)) 324 rev->show_notes = 1; 325 if (rev->show_notes) 326 load_display_notes(&rev->notes_opt); 327 328 if ((rev->diffopt.pickaxe_opts & DIFF_PICKAXE_KINDS_MASK) || 329 rev->diffopt.filter || rev->diffopt.flags.follow_renames) 330 rev->always_show_header = 0; 331 332 if (source || w.source) { 333 init_revision_sources(&revision_sources); 334 rev->sources = &revision_sources; 335 } 336 337 if (mailmap) { 338 rev->mailmap = xmalloc(sizeof(struct string_list)); 339 string_list_init_nodup(rev->mailmap); 340 read_mailmap(rev->mailmap); 341 } 342 343 if (rev->pretty_given && rev->commit_format == CMIT_FMT_RAW) { 344 /* 345 * "log --pretty=raw" is special; ignore UI oriented 346 * configuration variables such as decoration. 347 */ 348 if (!cfg->decoration_given) 349 cfg->decoration_style = 0; 350 if (!rev->abbrev_commit_given) 351 rev->abbrev_commit = 0; 352 } 353 354 if (rev->commit_format == CMIT_FMT_USERFORMAT) { 355 if (!w.decorate) { 356 /* 357 * Disable decoration loading if the format will not 358 * show them anyway. 359 */ 360 cfg->decoration_style = 0; 361 } else if (!cfg->decoration_style) { 362 /* 363 * If we are going to show them, make sure we do load 364 * them here, but taking care not to override a 365 * specific style set by config or --decorate. 366 */ 367 cfg->decoration_style = DECORATE_SHORT_REFS; 368 } 369 } 370 371 if (cfg->decoration_style || rev->simplify_by_decoration) { 372 set_default_decoration_filter(&decoration_filter); 373 374 if (cfg->decoration_style) 375 rev->show_decorations = 1; 376 377 load_ref_decorations(&decoration_filter, cfg->decoration_style); 378 } 379 380 if (rev->line_level_traverse) 381 line_log_init(rev, line_cb.prefix, &line_cb.args); 382 383 setup_pager(the_repository); 384} 385 386static void cmd_log_init(int argc, const char **argv, const char *prefix, 387 struct rev_info *rev, struct setup_revision_opt *opt, 388 struct log_config *cfg) 389{ 390 cmd_log_init_defaults(rev, cfg); 391 cmd_log_init_finish(argc, argv, prefix, rev, opt, cfg); 392} 393 394static int cmd_log_walk_no_free(struct rev_info *rev) 395{ 396 struct commit *commit; 397 int saved_nrl = 0; 398 int saved_dcctc = 0; 399 int result; 400 401 if (prepare_revision_walk(rev)) 402 die(_("revision walk setup failed")); 403 404 /* 405 * For --check and --exit-code, the exit code is based on CHECK_FAILED 406 * and HAS_CHANGES being accumulated in rev->diffopt, so be careful to 407 * retain that state information if replacing rev->diffopt in this loop 408 */ 409 while ((commit = get_revision(rev)) != NULL) { 410 if (!log_tree_commit(rev, commit) && rev->max_count >= 0) 411 /* 412 * We decremented max_count in get_revision, 413 * but we didn't actually show the commit. 414 */ 415 rev->max_count++; 416 if (!rev->reflog_info && !rev->remerge_diff) { 417 /* 418 * We may show a given commit multiple times when 419 * walking the reflogs. Therefore we still need it. 420 * 421 * Likewise, we potentially still need the parents 422 * of * already shown commits to determine merge 423 * bases when showing remerge diffs. 424 */ 425 free_commit_buffer(the_repository->parsed_objects, 426 commit); 427 free_commit_list(commit->parents); 428 commit->parents = NULL; 429 } 430 if (saved_nrl < rev->diffopt.needed_rename_limit) 431 saved_nrl = rev->diffopt.needed_rename_limit; 432 if (rev->diffopt.degraded_cc_to_c) 433 saved_dcctc = 1; 434 } 435 rev->diffopt.degraded_cc_to_c = saved_dcctc; 436 rev->diffopt.needed_rename_limit = saved_nrl; 437 438 result = diff_result_code(rev); 439 if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF && 440 rev->diffopt.flags.check_failed) { 441 result = 02; 442 } 443 return result; 444} 445 446static int cmd_log_walk(struct rev_info *rev) 447{ 448 int retval; 449 450 rev->diffopt.no_free = 1; 451 retval = cmd_log_walk_no_free(rev); 452 rev->diffopt.no_free = 0; 453 diff_free(&rev->diffopt); 454 return retval; 455} 456 457static int git_log_config(const char *var, const char *value, 458 const struct config_context *ctx, void *cb) 459{ 460 struct log_config *cfg = cb; 461 const char *slot_name; 462 463 if (!strcmp(var, "format.pretty")) { 464 FREE_AND_NULL(cfg->fmt_pretty); 465 return git_config_string(&cfg->fmt_pretty, var, value); 466 } 467 if (!strcmp(var, "format.subjectprefix")) { 468 FREE_AND_NULL(cfg->fmt_patch_subject_prefix); 469 return git_config_string(&cfg->fmt_patch_subject_prefix, var, value); 470 } 471 if (!strcmp(var, "format.filenamemaxlength")) { 472 cfg->fmt_patch_name_max = git_config_int(var, value, ctx->kvi); 473 return 0; 474 } 475 if (!strcmp(var, "format.encodeemailheaders")) { 476 cfg->default_encode_email_headers = git_config_bool(var, value); 477 return 0; 478 } 479 if (!strcmp(var, "log.abbrevcommit")) { 480 cfg->default_abbrev_commit = git_config_bool(var, value); 481 return 0; 482 } 483 if (!strcmp(var, "log.date")) { 484 FREE_AND_NULL(cfg->default_date_mode); 485 return git_config_string(&cfg->default_date_mode, var, value); 486 } 487 if (!strcmp(var, "log.decorate")) { 488 cfg->decoration_style = parse_decoration_style(value); 489 if (cfg->decoration_style < 0) 490 cfg->decoration_style = 0; /* maybe warn? */ 491 return 0; 492 } 493 if (!strcmp(var, "log.diffmerges")) { 494 if (!value) 495 return config_error_nonbool(var); 496 return diff_merges_config(value); 497 } 498 if (!strcmp(var, "log.showroot")) { 499 cfg->default_show_root = git_config_bool(var, value); 500 return 0; 501 } 502 if (!strcmp(var, "log.follow")) { 503 cfg->default_follow = git_config_bool(var, value); 504 return 0; 505 } 506 if (skip_prefix(var, "color.decorate.", &slot_name)) 507 return parse_decorate_color_config(var, slot_name, value); 508 if (!strcmp(var, "log.mailmap")) { 509 cfg->use_mailmap_config = git_config_bool(var, value); 510 return 0; 511 } 512 if (!strcmp(var, "log.showsignature")) { 513 cfg->default_show_signature = git_config_bool(var, value); 514 return 0; 515 } 516 517 return git_diff_ui_config(var, value, ctx, cb); 518} 519 520#ifndef WITH_BREAKING_CHANGES 521int cmd_whatchanged(int argc, 522 const char **argv, 523 const char *prefix, 524 struct repository *repo UNUSED) 525{ 526 struct log_config cfg; 527 struct rev_info rev; 528 struct setup_revision_opt opt; 529 int ret; 530 531 log_config_init(&cfg); 532 init_diff_ui_defaults(); 533 repo_config(the_repository, git_log_config, &cfg); 534 535 repo_init_revisions(the_repository, &rev, prefix); 536 repo_config(the_repository, grep_config, &rev.grep_filter); 537 538 rev.diff = 1; 539 rev.simplify_history = 0; 540 memset(&opt, 0, sizeof(opt)); 541 opt.def = "HEAD"; 542 opt.revarg_opt = REVARG_COMMITTISH; 543 cmd_log_init(argc, argv, prefix, &rev, &opt, &cfg); 544 545 if (!cfg.i_still_use_this) 546 you_still_use_that("git whatchanged", 547 _("\n" 548 "hint: You can replace 'git whatchanged <opts>' with:\n" 549 "hint:\tgit log <opts> --raw --no-merges\n" 550 "hint: Or make an alias:\n" 551 "hint:\tgit config set --global alias.whatchanged 'log --raw --no-merges'\n" 552 "\n")); 553 554 if (!rev.diffopt.output_format) 555 rev.diffopt.output_format = DIFF_FORMAT_RAW; 556 557 ret = cmd_log_walk(&rev); 558 559 release_revisions(&rev); 560 log_config_release(&cfg); 561 return ret; 562} 563#endif 564 565static void show_tagger(const char *buf, struct rev_info *rev) 566{ 567 struct strbuf out = STRBUF_INIT; 568 struct pretty_print_context pp = {0}; 569 570 pp.fmt = rev->commit_format; 571 pp.date_mode = rev->date_mode; 572 pp_user_info(&pp, "Tagger", &out, buf, get_log_output_encoding()); 573 fprintf(rev->diffopt.file, "%s", out.buf); 574 strbuf_release(&out); 575} 576 577static int show_blob_object(const struct object_id *oid, struct rev_info *rev, const char *obj_name) 578{ 579 struct object_id oidc; 580 struct object_context obj_context = {0}; 581 char *buf; 582 unsigned long size; 583 584 fflush(rev->diffopt.file); 585 if (!rev->diffopt.flags.textconv_set_via_cmdline || 586 !rev->diffopt.flags.allow_textconv) 587 return stream_blob_to_fd(1, oid, NULL, 0); 588 589 if (get_oid_with_context(the_repository, obj_name, 590 GET_OID_RECORD_PATH, 591 &oidc, &obj_context)) 592 die(_("not a valid object name %s"), obj_name); 593 if (!obj_context.path || 594 !textconv_object(the_repository, obj_context.path, 595 obj_context.mode, &oidc, 1, &buf, &size)) { 596 object_context_release(&obj_context); 597 return stream_blob_to_fd(1, oid, NULL, 0); 598 } 599 600 if (!buf) 601 die(_("git show %s: bad file"), obj_name); 602 603 write_or_die(1, buf, size); 604 object_context_release(&obj_context); 605 free(buf); 606 return 0; 607} 608 609static int show_tag_object(const struct object_id *oid, struct rev_info *rev) 610{ 611 unsigned long size; 612 enum object_type type; 613 char *buf = odb_read_object(the_repository->objects, oid, &type, &size); 614 unsigned long offset = 0; 615 616 if (!buf) 617 return error(_("could not read object %s"), oid_to_hex(oid)); 618 619 assert(type == OBJ_TAG); 620 while (offset < size && buf[offset] != '\n') { 621 unsigned long new_offset = offset + 1; 622 const char *ident; 623 while (new_offset < size && buf[new_offset++] != '\n') 624 ; /* do nothing */ 625 if (skip_prefix(buf + offset, "tagger ", &ident)) 626 show_tagger(ident, rev); 627 offset = new_offset; 628 } 629 630 if (offset < size) 631 fwrite(buf + offset, size - offset, 1, rev->diffopt.file); 632 free(buf); 633 return 0; 634} 635 636static int show_tree_object(const struct object_id *oid UNUSED, 637 struct strbuf *base UNUSED, 638 const char *pathname, unsigned mode, 639 void *context) 640{ 641 FILE *file = context; 642 fprintf(file, "%s%s\n", pathname, S_ISDIR(mode) ? "/" : ""); 643 return 0; 644} 645 646static void show_setup_revisions_tweak(struct rev_info *rev) 647{ 648 if (rev->first_parent_only) 649 diff_merges_default_to_first_parent(rev); 650 else 651 diff_merges_default_to_dense_combined(rev); 652 if (!rev->diffopt.output_format) 653 rev->diffopt.output_format = DIFF_FORMAT_PATCH; 654} 655 656int cmd_show(int argc, 657 const char **argv, 658 const char *prefix, 659 struct repository *repo UNUSED) 660{ 661 struct log_config cfg; 662 struct rev_info rev; 663 unsigned int i; 664 struct setup_revision_opt opt; 665 struct pathspec match_all; 666 int ret = 0; 667 668 log_config_init(&cfg); 669 init_diff_ui_defaults(); 670 repo_config(the_repository, git_log_config, &cfg); 671 672 if (the_repository->gitdir) { 673 prepare_repo_settings(the_repository); 674 the_repository->settings.command_requires_full_index = 0; 675 } 676 677 memset(&match_all, 0, sizeof(match_all)); 678 repo_init_revisions(the_repository, &rev, prefix); 679 repo_config(the_repository, grep_config, &rev.grep_filter); 680 681 rev.diff = 1; 682 rev.always_show_header = 1; 683 rev.no_walk = 1; 684 rev.diffopt.stat_width = -1; /* Scale to real terminal size */ 685 686 memset(&opt, 0, sizeof(opt)); 687 opt.def = "HEAD"; 688 opt.tweak = show_setup_revisions_tweak; 689 cmd_log_init(argc, argv, prefix, &rev, &opt, &cfg); 690 691 if (!rev.no_walk) { 692 ret = cmd_log_walk(&rev); 693 release_revisions(&rev); 694 log_config_release(&cfg); 695 return ret; 696 } 697 698 rev.diffopt.no_free = 1; 699 for (i = 0; i < rev.pending.nr && !ret; i++) { 700 struct object *o = rev.pending.objects[i].item; 701 const char *name = rev.pending.objects[i].name; 702 switch (o->type) { 703 case OBJ_BLOB: 704 ret = show_blob_object(&o->oid, &rev, name); 705 break; 706 case OBJ_TAG: { 707 struct tag *t = (struct tag *)o; 708 struct object_id *oid = get_tagged_oid(t); 709 710 if (rev.shown_one) 711 putchar('\n'); 712 fprintf(rev.diffopt.file, "%stag %s%s\n", 713 diff_get_color_opt(&rev.diffopt, DIFF_COMMIT), 714 t->tag, 715 diff_get_color_opt(&rev.diffopt, DIFF_RESET)); 716 ret = show_tag_object(&o->oid, &rev); 717 rev.shown_one = 1; 718 if (ret) 719 break; 720 o = parse_object(the_repository, oid); 721 if (!o) 722 ret = error(_("could not read object %s"), 723 oid_to_hex(oid)); 724 rev.pending.objects[i].item = o; 725 i--; 726 break; 727 } 728 case OBJ_TREE: 729 if (rev.shown_one) 730 putchar('\n'); 731 fprintf(rev.diffopt.file, "%stree %s%s\n\n", 732 diff_get_color_opt(&rev.diffopt, DIFF_COMMIT), 733 name, 734 diff_get_color_opt(&rev.diffopt, DIFF_RESET)); 735 read_tree(the_repository, (struct tree *)o, 736 &match_all, show_tree_object, 737 rev.diffopt.file); 738 rev.shown_one = 1; 739 break; 740 case OBJ_COMMIT: 741 { 742 struct object_array old; 743 struct object_array blank = OBJECT_ARRAY_INIT; 744 745 memcpy(&old, &rev.pending, sizeof(old)); 746 memcpy(&rev.pending, &blank, sizeof(rev.pending)); 747 748 add_object_array(o, name, &rev.pending); 749 ret = cmd_log_walk_no_free(&rev); 750 751 /* 752 * No need for 753 * object_array_clear(&pending). It was 754 * cleared already in prepare_revision_walk() 755 */ 756 memcpy(&rev.pending, &old, sizeof(rev.pending)); 757 break; 758 } 759 default: 760 ret = error(_("unknown type: %d"), o->type); 761 } 762 } 763 764 rev.diffopt.no_free = 0; 765 diff_free(&rev.diffopt); 766 release_revisions(&rev); 767 log_config_release(&cfg); 768 769 return ret; 770} 771 772/* 773 * This is equivalent to "git log -g --abbrev-commit --pretty=oneline" 774 */ 775int cmd_log_reflog(int argc, 776 const char **argv, 777 const char *prefix, 778 struct repository *repo UNUSED) 779{ 780 struct log_config cfg; 781 struct rev_info rev; 782 struct setup_revision_opt opt; 783 int ret; 784 785 log_config_init(&cfg); 786 init_diff_ui_defaults(); 787 repo_config(the_repository, git_log_config, &cfg); 788 789 repo_init_revisions(the_repository, &rev, prefix); 790 init_reflog_walk(&rev.reflog_info); 791 repo_config(the_repository, grep_config, &rev.grep_filter); 792 793 rev.verbose_header = 1; 794 memset(&opt, 0, sizeof(opt)); 795 opt.def = "HEAD"; 796 cmd_log_init_defaults(&rev, &cfg); 797 rev.abbrev_commit = 1; 798 rev.commit_format = CMIT_FMT_ONELINE; 799 rev.use_terminator = 1; 800 rev.always_show_header = 1; 801 cmd_log_init_finish(argc, argv, prefix, &rev, &opt, &cfg); 802 803 ret = cmd_log_walk(&rev); 804 805 release_revisions(&rev); 806 log_config_release(&cfg); 807 return ret; 808} 809 810static void log_setup_revisions_tweak(struct rev_info *rev) 811{ 812 if (rev->diffopt.flags.default_follow_renames && 813 diff_check_follow_pathspec(&rev->prune_data, 0)) 814 rev->diffopt.flags.follow_renames = 1; 815 816 if (rev->first_parent_only) 817 diff_merges_default_to_first_parent(rev); 818} 819 820int cmd_log(int argc, 821 const char **argv, 822 const char *prefix, 823 struct repository *repo UNUSED) 824{ 825 struct log_config cfg; 826 struct rev_info rev; 827 struct setup_revision_opt opt; 828 int ret; 829 830 log_config_init(&cfg); 831 init_diff_ui_defaults(); 832 repo_config(the_repository, git_log_config, &cfg); 833 834 repo_init_revisions(the_repository, &rev, prefix); 835 repo_config(the_repository, grep_config, &rev.grep_filter); 836 837 rev.always_show_header = 1; 838 memset(&opt, 0, sizeof(opt)); 839 opt.def = "HEAD"; 840 opt.revarg_opt = REVARG_COMMITTISH; 841 opt.tweak = log_setup_revisions_tweak; 842 cmd_log_init(argc, argv, prefix, &rev, &opt, &cfg); 843 844 ret = cmd_log_walk(&rev); 845 846 release_revisions(&rev); 847 log_config_release(&cfg); 848 return ret; 849} 850 851/* format-patch */ 852 853enum cover_setting { 854 COVER_UNSET, 855 COVER_OFF, 856 COVER_ON, 857 COVER_AUTO 858}; 859 860enum thread_level { 861 THREAD_UNSET, 862 THREAD_SHALLOW, 863 THREAD_DEEP 864}; 865 866enum cover_from_description { 867 COVER_FROM_NONE, 868 COVER_FROM_MESSAGE, 869 COVER_FROM_SUBJECT, 870 COVER_FROM_AUTO 871}; 872 873enum auto_base_setting { 874 AUTO_BASE_NEVER, 875 AUTO_BASE_ALWAYS, 876 AUTO_BASE_WHEN_ABLE 877}; 878 879struct format_config { 880 struct log_config log; 881 enum thread_level thread; 882 int do_signoff; 883 enum auto_base_setting auto_base; 884 char *base_commit; 885 char *from; 886 char *signature; 887 char *signature_file; 888 enum cover_setting config_cover_letter; 889 char *config_output_directory; 890 enum cover_from_description cover_from_description_mode; 891 int show_notes; 892 struct display_notes_opt notes_opt; 893 int numbered_cmdline_opt; 894 int numbered; 895 int auto_number; 896 char *default_attach; 897 struct string_list extra_hdr; 898 struct string_list extra_to; 899 struct string_list extra_cc; 900 int keep_subject; 901 int subject_prefix; 902 struct strbuf sprefix; 903 char *fmt_patch_suffix; 904}; 905 906static void format_config_init(struct format_config *cfg) 907{ 908 memset(cfg, 0, sizeof(*cfg)); 909 log_config_init(&cfg->log); 910 cfg->cover_from_description_mode = COVER_FROM_MESSAGE; 911 cfg->auto_number = 1; 912 string_list_init_dup(&cfg->extra_hdr); 913 string_list_init_dup(&cfg->extra_to); 914 string_list_init_dup(&cfg->extra_cc); 915 strbuf_init(&cfg->sprefix, 0); 916 cfg->fmt_patch_suffix = xstrdup(".patch"); 917} 918 919static void format_config_release(struct format_config *cfg) 920{ 921 log_config_release(&cfg->log); 922 free(cfg->base_commit); 923 free(cfg->from); 924 free(cfg->signature); 925 free(cfg->signature_file); 926 free(cfg->config_output_directory); 927 free(cfg->default_attach); 928 string_list_clear(&cfg->extra_hdr, 0); 929 string_list_clear(&cfg->extra_to, 0); 930 string_list_clear(&cfg->extra_cc, 0); 931 strbuf_release(&cfg->sprefix); 932 free(cfg->fmt_patch_suffix); 933} 934 935static enum cover_from_description parse_cover_from_description(const char *arg) 936{ 937 if (!arg || !strcmp(arg, "default")) 938 return COVER_FROM_MESSAGE; 939 else if (!strcmp(arg, "none")) 940 return COVER_FROM_NONE; 941 else if (!strcmp(arg, "message")) 942 return COVER_FROM_MESSAGE; 943 else if (!strcmp(arg, "subject")) 944 return COVER_FROM_SUBJECT; 945 else if (!strcmp(arg, "auto")) 946 return COVER_FROM_AUTO; 947 else 948 die(_("%s: invalid cover from description mode"), arg); 949} 950 951static void add_header(struct format_config *cfg, const char *value) 952{ 953 struct string_list_item *item; 954 int len = strlen(value); 955 while (len && value[len - 1] == '\n') 956 len--; 957 958 if (!strncasecmp(value, "to: ", 4)) { 959 item = string_list_append(&cfg->extra_to, value + 4); 960 len -= 4; 961 } else if (!strncasecmp(value, "cc: ", 4)) { 962 item = string_list_append(&cfg->extra_cc, value + 4); 963 len -= 4; 964 } else { 965 item = string_list_append(&cfg->extra_hdr, value); 966 } 967 968 item->string[len] = '\0'; 969} 970 971static int git_format_config(const char *var, const char *value, 972 const struct config_context *ctx, void *cb) 973{ 974 struct format_config *cfg = cb; 975 976 if (!strcmp(var, "format.headers")) { 977 if (!value) 978 die(_("format.headers without value")); 979 add_header(cfg, value); 980 return 0; 981 } 982 if (!strcmp(var, "format.suffix")) { 983 FREE_AND_NULL(cfg->fmt_patch_suffix); 984 return git_config_string(&cfg->fmt_patch_suffix, var, value); 985 } 986 if (!strcmp(var, "format.to")) { 987 if (!value) 988 return config_error_nonbool(var); 989 string_list_append(&cfg->extra_to, value); 990 return 0; 991 } 992 if (!strcmp(var, "format.cc")) { 993 if (!value) 994 return config_error_nonbool(var); 995 string_list_append(&cfg->extra_cc, value); 996 return 0; 997 } 998 if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff") || 999 !strcmp(var, "color.ui") || !strcmp(var, "diff.submodule")) { 1000 return 0; 1001 } 1002 if (!strcmp(var, "format.numbered")) { 1003 if (value && !strcasecmp(value, "auto")) { 1004 cfg->auto_number = 1; 1005 return 0; 1006 } 1007 cfg->numbered = git_config_bool(var, value); 1008 cfg->auto_number = cfg->auto_number && cfg->numbered; 1009 return 0; 1010 } 1011 if (!strcmp(var, "format.attach")) { 1012 if (value && *value) { 1013 FREE_AND_NULL(cfg->default_attach); 1014 cfg->default_attach = xstrdup(value); 1015 } else if (value && !*value) { 1016 FREE_AND_NULL(cfg->default_attach); 1017 } else { 1018 FREE_AND_NULL(cfg->default_attach); 1019 cfg->default_attach = xstrdup(git_version_string); 1020 } 1021 return 0; 1022 } 1023 if (!strcmp(var, "format.thread")) { 1024 if (value && !strcasecmp(value, "deep")) { 1025 cfg->thread = THREAD_DEEP; 1026 return 0; 1027 } 1028 if (value && !strcasecmp(value, "shallow")) { 1029 cfg->thread = THREAD_SHALLOW; 1030 return 0; 1031 } 1032 cfg->thread = git_config_bool(var, value) ? THREAD_SHALLOW : THREAD_UNSET; 1033 return 0; 1034 } 1035 if (!strcmp(var, "format.signoff")) { 1036 cfg->do_signoff = git_config_bool(var, value); 1037 return 0; 1038 } 1039 if (!strcmp(var, "format.signature")) { 1040 FREE_AND_NULL(cfg->signature); 1041 return git_config_string(&cfg->signature, var, value); 1042 } 1043 if (!strcmp(var, "format.signaturefile")) { 1044 FREE_AND_NULL(cfg->signature_file); 1045 return git_config_pathname(&cfg->signature_file, var, value); 1046 } 1047 if (!strcmp(var, "format.coverletter")) { 1048 if (value && !strcasecmp(value, "auto")) { 1049 cfg->config_cover_letter = COVER_AUTO; 1050 return 0; 1051 } 1052 cfg->config_cover_letter = git_config_bool(var, value) ? COVER_ON : COVER_OFF; 1053 return 0; 1054 } 1055 if (!strcmp(var, "format.outputdirectory")) { 1056 FREE_AND_NULL(cfg->config_output_directory); 1057 return git_config_string(&cfg->config_output_directory, var, value); 1058 } 1059 if (!strcmp(var, "format.useautobase")) { 1060 if (value && !strcasecmp(value, "whenAble")) { 1061 cfg->auto_base = AUTO_BASE_WHEN_ABLE; 1062 return 0; 1063 } 1064 cfg->auto_base = git_config_bool(var, value) ? AUTO_BASE_ALWAYS : AUTO_BASE_NEVER; 1065 return 0; 1066 } 1067 if (!strcmp(var, "format.from")) { 1068 int b = git_parse_maybe_bool(value); 1069 FREE_AND_NULL(cfg->from); 1070 if (b < 0) 1071 cfg->from = xstrdup(value); 1072 else if (b) 1073 cfg->from = xstrdup(git_committer_info(IDENT_NO_DATE)); 1074 return 0; 1075 } 1076 if (!strcmp(var, "format.forceinbodyfrom")) { 1077 force_in_body_from = git_config_bool(var, value); 1078 return 0; 1079 } 1080 if (!strcmp(var, "format.notes")) { 1081 int b = git_parse_maybe_bool(value); 1082 if (b < 0) 1083 enable_ref_display_notes(&cfg->notes_opt, &cfg->show_notes, value); 1084 else if (b) 1085 enable_default_display_notes(&cfg->notes_opt, &cfg->show_notes); 1086 else 1087 disable_display_notes(&cfg->notes_opt, &cfg->show_notes); 1088 return 0; 1089 } 1090 if (!strcmp(var, "format.coverfromdescription")) { 1091 cfg->cover_from_description_mode = parse_cover_from_description(value); 1092 return 0; 1093 } 1094 if (!strcmp(var, "format.mboxrd")) { 1095 stdout_mboxrd = git_config_bool(var, value); 1096 return 0; 1097 } 1098 if (!strcmp(var, "format.noprefix")) { 1099 format_no_prefix = 1; 1100 return 0; 1101 } 1102 1103 /* 1104 * ignore some porcelain config which would otherwise be parsed by 1105 * git_diff_ui_config(), via git_log_config(); we can't just avoid 1106 * diff_ui_config completely, because we do care about some ui options 1107 * like color. 1108 */ 1109 if (!strcmp(var, "diff.noprefix")) 1110 return 0; 1111 1112 return git_log_config(var, value, ctx, &cfg->log); 1113} 1114 1115static const char *output_directory = NULL; 1116static int outdir_offset; 1117 1118static int open_next_file(struct commit *commit, const char *subject, 1119 struct rev_info *rev, int quiet) 1120{ 1121 struct strbuf filename = STRBUF_INIT; 1122 1123 if (output_directory) { 1124 strbuf_addstr(&filename, output_directory); 1125 strbuf_complete(&filename, '/'); 1126 } 1127 1128 if (rev->numbered_files) 1129 strbuf_addf(&filename, "%d", rev->nr); 1130 else if (commit) 1131 fmt_output_commit(&filename, commit, rev); 1132 else 1133 fmt_output_subject(&filename, subject, rev); 1134 1135 if (!quiet) 1136 printf("%s\n", filename.buf + outdir_offset); 1137 1138 if (!(rev->diffopt.file = fopen(filename.buf, "w"))) { 1139 error_errno(_("cannot open patch file %s"), filename.buf); 1140 strbuf_release(&filename); 1141 return -1; 1142 } 1143 1144 strbuf_release(&filename); 1145 return 0; 1146} 1147 1148static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids) 1149{ 1150 struct rev_info check_rev; 1151 struct commit *commit, *c1, *c2; 1152 struct object *o1, *o2; 1153 unsigned flags1, flags2; 1154 1155 if (rev->pending.nr != 2) 1156 die(_("need exactly one range")); 1157 1158 o1 = rev->pending.objects[0].item; 1159 o2 = rev->pending.objects[1].item; 1160 flags1 = o1->flags; 1161 flags2 = o2->flags; 1162 c1 = lookup_commit_reference(the_repository, &o1->oid); 1163 c2 = lookup_commit_reference(the_repository, &o2->oid); 1164 1165 if ((flags1 & UNINTERESTING) == (flags2 & UNINTERESTING)) 1166 die(_("not a range")); 1167 1168 init_patch_ids(the_repository, ids); 1169 1170 /* given a range a..b get all patch ids for b..a */ 1171 repo_init_revisions(the_repository, &check_rev, rev->prefix); 1172 check_rev.max_parents = 1; 1173 o1->flags ^= UNINTERESTING; 1174 o2->flags ^= UNINTERESTING; 1175 add_pending_object(&check_rev, o1, "o1"); 1176 add_pending_object(&check_rev, o2, "o2"); 1177 if (prepare_revision_walk(&check_rev)) 1178 die(_("revision walk setup failed")); 1179 1180 while ((commit = get_revision(&check_rev)) != NULL) { 1181 add_commit_patch_id(commit, ids); 1182 } 1183 1184 /* reset for next revision walk */ 1185 clear_commit_marks(c1, SEEN | UNINTERESTING | SHOWN | ADDED); 1186 clear_commit_marks(c2, SEEN | UNINTERESTING | SHOWN | ADDED); 1187 o1->flags = flags1; 1188 o2->flags = flags2; 1189} 1190 1191static void gen_message_id(struct rev_info *info, const char *base) 1192{ 1193 struct strbuf buf = STRBUF_INIT; 1194 strbuf_addf(&buf, "%s.%"PRItime".git.%s", base, 1195 (timestamp_t) time(NULL), 1196 git_committer_info(IDENT_NO_NAME|IDENT_NO_DATE|IDENT_STRICT)); 1197 info->message_id = strbuf_detach(&buf, NULL); 1198} 1199 1200static void print_signature(const char *signature, FILE *file) 1201{ 1202 if (!signature || !*signature) 1203 return; 1204 1205 fprintf(file, "-- \n%s", signature); 1206 if (signature[strlen(signature)-1] != '\n') 1207 putc('\n', file); 1208 putc('\n', file); 1209} 1210 1211static char *find_branch_name(struct rev_info *rev) 1212{ 1213 struct object_id branch_oid; 1214 const struct object_id *tip_oid; 1215 const char *ref, *v; 1216 char *full_ref, *branch = NULL; 1217 int interesting_found = 0; 1218 size_t idx; 1219 1220 for (size_t i = 0; i < rev->cmdline.nr; i++) { 1221 if (rev->cmdline.rev[i].flags & UNINTERESTING) 1222 continue; 1223 if (interesting_found) 1224 return NULL; 1225 interesting_found = 1; 1226 idx = i; 1227 } 1228 if (!interesting_found) 1229 return NULL; 1230 ref = rev->cmdline.rev[idx].name; 1231 tip_oid = &rev->cmdline.rev[idx].item->oid; 1232 if (repo_dwim_ref(the_repository, ref, strlen(ref), &branch_oid, 1233 &full_ref, 0) && 1234 skip_prefix(full_ref, "refs/heads/", &v) && 1235 oideq(tip_oid, &branch_oid)) 1236 branch = xstrdup(v); 1237 free(full_ref); 1238 return branch; 1239} 1240 1241static void show_diffstat(struct rev_info *rev, 1242 struct commit *origin, struct commit *head) 1243{ 1244 struct diff_options opts; 1245 1246 memcpy(&opts, &rev->diffopt, sizeof(opts)); 1247 opts.output_format = DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT; 1248 diff_setup_done(&opts); 1249 1250 diff_tree_oid(get_commit_tree_oid(origin), 1251 get_commit_tree_oid(head), 1252 "", &opts); 1253 diffcore_std(&opts); 1254 diff_flush(&opts); 1255 1256 fprintf(rev->diffopt.file, "\n"); 1257} 1258 1259static void read_desc_file(struct strbuf *buf, const char *desc_file) 1260{ 1261 if (strbuf_read_file(buf, desc_file, 0) < 0) 1262 die_errno(_("unable to read branch description file '%s'"), 1263 desc_file); 1264} 1265 1266static void prepare_cover_text(struct pretty_print_context *pp, 1267 const char *description_file, 1268 const char *branch_name, 1269 struct strbuf *sb, 1270 const char *encoding, 1271 int need_8bit_cte, 1272 const struct format_config *cfg) 1273{ 1274 const char *subject = "*** SUBJECT HERE ***"; 1275 const char *body = "*** BLURB HERE ***"; 1276 struct strbuf description_sb = STRBUF_INIT; 1277 struct strbuf subject_sb = STRBUF_INIT; 1278 1279 if (cfg->cover_from_description_mode == COVER_FROM_NONE) 1280 goto do_pp; 1281 1282 if (description_file && *description_file) 1283 read_desc_file(&description_sb, description_file); 1284 else if (branch_name && *branch_name) 1285 read_branch_desc(&description_sb, branch_name); 1286 if (!description_sb.len) 1287 goto do_pp; 1288 1289 if (cfg->cover_from_description_mode == COVER_FROM_SUBJECT || 1290 cfg->cover_from_description_mode == COVER_FROM_AUTO) 1291 body = format_subject(&subject_sb, description_sb.buf, " "); 1292 1293 if (cfg->cover_from_description_mode == COVER_FROM_MESSAGE || 1294 (cfg->cover_from_description_mode == COVER_FROM_AUTO && 1295 subject_sb.len > COVER_FROM_AUTO_MAX_SUBJECT_LEN)) 1296 body = description_sb.buf; 1297 else 1298 subject = subject_sb.buf; 1299 1300do_pp: 1301 pp_email_subject(pp, &subject, sb, encoding, need_8bit_cte); 1302 pp_remainder(pp, &body, sb, 0); 1303 1304 strbuf_release(&description_sb); 1305 strbuf_release(&subject_sb); 1306} 1307 1308static int get_notes_refs(struct string_list_item *item, void *arg) 1309{ 1310 strvec_pushf(arg, "--notes=%s", item->string); 1311 return 0; 1312} 1313 1314static void get_notes_args(struct strvec *arg, struct rev_info *rev) 1315{ 1316 if (!rev->show_notes) { 1317 strvec_push(arg, "--no-notes"); 1318 } else if (rev->notes_opt.use_default_notes > 0 || 1319 (rev->notes_opt.use_default_notes == -1 && 1320 !rev->notes_opt.extra_notes_refs.nr)) { 1321 strvec_push(arg, "--notes"); 1322 } else { 1323 for_each_string_list(&rev->notes_opt.extra_notes_refs, get_notes_refs, arg); 1324 } 1325} 1326 1327static void make_cover_letter(struct rev_info *rev, int use_separate_file, 1328 struct commit *origin, 1329 int nr, struct commit **list, 1330 const char *description_file, 1331 const char *branch_name, 1332 int quiet, 1333 const struct format_config *cfg) 1334{ 1335 const char *committer; 1336 struct shortlog log; 1337 struct strbuf sb = STRBUF_INIT; 1338 int i; 1339 const char *encoding = "UTF-8"; 1340 int need_8bit_cte = 0; 1341 struct pretty_print_context pp = {0}; 1342 struct commit *head = list[0]; 1343 char *to_free = NULL; 1344 1345 if (!cmit_fmt_is_mail(rev->commit_format)) 1346 die(_("cover letter needs email format")); 1347 1348 committer = git_committer_info(0); 1349 1350 if (use_separate_file && 1351 open_next_file(NULL, rev->numbered_files ? NULL : "cover-letter", rev, quiet)) 1352 die(_("failed to create cover-letter file")); 1353 1354 log_write_email_headers(rev, head, &pp.after_subject, &need_8bit_cte, 0); 1355 1356 for (i = 0; !need_8bit_cte && i < nr; i++) { 1357 const char *buf = repo_get_commit_buffer(the_repository, 1358 list[i], NULL); 1359 if (has_non_ascii(buf)) 1360 need_8bit_cte = 1; 1361 repo_unuse_commit_buffer(the_repository, list[i], buf); 1362 } 1363 1364 if (!branch_name) 1365 branch_name = to_free = find_branch_name(rev); 1366 1367 pp.fmt = CMIT_FMT_EMAIL; 1368 pp.date_mode.type = DATE_RFC2822; 1369 pp.rev = rev; 1370 pp.encode_email_headers = rev->encode_email_headers; 1371 pp_user_info(&pp, NULL, &sb, committer, encoding); 1372 prepare_cover_text(&pp, description_file, branch_name, &sb, 1373 encoding, need_8bit_cte, cfg); 1374 fprintf(rev->diffopt.file, "%s\n", sb.buf); 1375 1376 free(to_free); 1377 free(pp.after_subject); 1378 strbuf_release(&sb); 1379 1380 shortlog_init(&log); 1381 log.wrap_lines = 1; 1382 log.wrap = MAIL_DEFAULT_WRAP; 1383 log.in1 = 2; 1384 log.in2 = 4; 1385 log.file = rev->diffopt.file; 1386 log.groups = SHORTLOG_GROUP_AUTHOR; 1387 shortlog_finish_setup(&log); 1388 for (i = 0; i < nr; i++) 1389 shortlog_add_commit(&log, list[i]); 1390 1391 shortlog_output(&log); 1392 1393 /* We can only do diffstat with a unique reference point */ 1394 if (origin) 1395 show_diffstat(rev, origin, head); 1396 1397 if (rev->idiff_oid1) { 1398 fprintf_ln(rev->diffopt.file, "%s", rev->idiff_title); 1399 show_interdiff(rev->idiff_oid1, rev->idiff_oid2, 0, 1400 &rev->diffopt); 1401 } 1402 1403 if (rev->rdiff1) { 1404 /* 1405 * Pass minimum required diff-options to range-diff; others 1406 * can be added later if deemed desirable. 1407 */ 1408 struct diff_options opts; 1409 struct range_diff_options range_diff_opts = { 1410 .creation_factor = rev->creation_factor, 1411 .dual_color = 1, 1412 .max_memory = RANGE_DIFF_MAX_MEMORY_DEFAULT, 1413 .diffopt = &opts, 1414 .log_arg = &rev->rdiff_log_arg 1415 }; 1416 1417 repo_diff_setup(the_repository, &opts); 1418 opts.file = rev->diffopt.file; 1419 opts.use_color = rev->diffopt.use_color; 1420 diff_setup_done(&opts); 1421 fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title); 1422 show_range_diff(rev->rdiff1, rev->rdiff2, &range_diff_opts); 1423 } 1424} 1425 1426static char *clean_message_id(const char *msg_id) 1427{ 1428 char ch; 1429 const char *a, *z, *m; 1430 1431 m = msg_id; 1432 while ((ch = *m) && (isspace(ch) || (ch == '<'))) 1433 m++; 1434 a = m; 1435 z = NULL; 1436 while ((ch = *m)) { 1437 if (!isspace(ch) && (ch != '>')) 1438 z = m; 1439 m++; 1440 } 1441 if (!z) 1442 die(_("insane in-reply-to: %s"), msg_id); 1443 if (++z == m) 1444 return xstrdup(a); 1445 return xmemdupz(a, z - a); 1446} 1447 1448static const char *set_outdir(const char *prefix, const char *output_directory) 1449{ 1450 if (output_directory && is_absolute_path(output_directory)) 1451 return output_directory; 1452 1453 if (!prefix || !*prefix) { 1454 if (output_directory) 1455 return output_directory; 1456 /* The user did not explicitly ask for "./" */ 1457 outdir_offset = 2; 1458 return "./"; 1459 } 1460 1461 outdir_offset = strlen(prefix); 1462 if (!output_directory) 1463 return prefix; 1464 1465 return prefix_filename(prefix, output_directory); 1466} 1467 1468static const char * const builtin_format_patch_usage[] = { 1469 N_("git format-patch [<options>] [<since> | <revision-range>]"), 1470 NULL 1471}; 1472 1473struct keep_callback_data { 1474 struct format_config *cfg; 1475 struct rev_info *revs; 1476}; 1477 1478static int keep_callback(const struct option *opt, const char *arg, int unset) 1479{ 1480 struct keep_callback_data *data = opt->value; 1481 BUG_ON_OPT_NEG(unset); 1482 BUG_ON_OPT_ARG(arg); 1483 data->revs->total = -1; 1484 data->cfg->keep_subject = 1; 1485 return 0; 1486} 1487 1488static int subject_prefix_callback(const struct option *opt, const char *arg, 1489 int unset) 1490{ 1491 struct format_config *cfg = opt->value; 1492 1493 BUG_ON_OPT_NEG(unset); 1494 cfg->subject_prefix = 1; 1495 strbuf_reset(&cfg->sprefix); 1496 strbuf_addstr(&cfg->sprefix, arg); 1497 return 0; 1498} 1499 1500static int rfc_callback(const struct option *opt, const char *arg, 1501 int unset) 1502{ 1503 const char **rfc = opt->value; 1504 1505 *rfc = opt->value; 1506 if (unset) 1507 *rfc = NULL; 1508 else 1509 *rfc = arg ? arg : "RFC"; 1510 return 0; 1511} 1512 1513static int numbered_callback(const struct option *opt, const char *arg, 1514 int unset) 1515{ 1516 struct format_config *cfg = opt->value; 1517 BUG_ON_OPT_ARG(arg); 1518 cfg->numbered = cfg->numbered_cmdline_opt = unset ? 0 : 1; 1519 if (unset) 1520 cfg->auto_number = 0; 1521 return 0; 1522} 1523 1524static int no_numbered_callback(const struct option *opt, const char *arg, 1525 int unset) 1526{ 1527 BUG_ON_OPT_NEG(unset); 1528 return numbered_callback(opt, arg, 1); 1529} 1530 1531static int output_directory_callback(const struct option *opt, const char *arg, 1532 int unset) 1533{ 1534 const char **dir = (const char **)opt->value; 1535 BUG_ON_OPT_NEG(unset); 1536 if (*dir) 1537 die(_("two output directories?")); 1538 *dir = arg; 1539 return 0; 1540} 1541 1542static int thread_callback(const struct option *opt, const char *arg, int unset) 1543{ 1544 struct format_config *cfg = opt->value; 1545 1546 if (unset) 1547 cfg->thread = THREAD_UNSET; 1548 else if (!arg || !strcmp(arg, "shallow")) 1549 cfg->thread = THREAD_SHALLOW; 1550 else if (!strcmp(arg, "deep")) 1551 cfg->thread = THREAD_DEEP; 1552 /* 1553 * Please update _git_formatpatch() in git-completion.bash 1554 * when you add new options. 1555 */ 1556 else 1557 return 1; 1558 return 0; 1559} 1560 1561static int attach_callback(const struct option *opt, const char *arg, int unset) 1562{ 1563 struct rev_info *rev = (struct rev_info *)opt->value; 1564 if (unset) 1565 rev->mime_boundary = NULL; 1566 else if (arg) 1567 rev->mime_boundary = arg; 1568 else 1569 rev->mime_boundary = git_version_string; 1570 rev->no_inline = unset ? 0 : 1; 1571 return 0; 1572} 1573 1574static int inline_callback(const struct option *opt, const char *arg, int unset) 1575{ 1576 struct rev_info *rev = (struct rev_info *)opt->value; 1577 if (unset) 1578 rev->mime_boundary = NULL; 1579 else if (arg) 1580 rev->mime_boundary = arg; 1581 else 1582 rev->mime_boundary = git_version_string; 1583 rev->no_inline = 0; 1584 return 0; 1585} 1586 1587static int header_callback(const struct option *opt, const char *arg, 1588 int unset) 1589{ 1590 struct format_config *cfg = opt->value; 1591 1592 if (unset) { 1593 string_list_clear(&cfg->extra_hdr, 0); 1594 string_list_clear(&cfg->extra_to, 0); 1595 string_list_clear(&cfg->extra_cc, 0); 1596 } else { 1597 add_header(cfg, arg); 1598 } 1599 return 0; 1600} 1601 1602static int from_callback(const struct option *opt, const char *arg, int unset) 1603{ 1604 char **from = opt->value; 1605 1606 free(*from); 1607 1608 if (unset) 1609 *from = NULL; 1610 else if (arg) 1611 *from = xstrdup(arg); 1612 else 1613 *from = xstrdup(git_committer_info(IDENT_NO_DATE)); 1614 return 0; 1615} 1616 1617static int base_callback(const struct option *opt, const char *arg, int unset) 1618{ 1619 struct format_config *cfg = opt->value; 1620 1621 if (unset) { 1622 cfg->auto_base = AUTO_BASE_NEVER; 1623 FREE_AND_NULL(cfg->base_commit); 1624 } else if (!strcmp(arg, "auto")) { 1625 cfg->auto_base = AUTO_BASE_ALWAYS; 1626 FREE_AND_NULL(cfg->base_commit); 1627 } else { 1628 cfg->auto_base = AUTO_BASE_NEVER; 1629 cfg->base_commit = xstrdup(arg); 1630 } 1631 return 0; 1632} 1633 1634struct base_tree_info { 1635 struct object_id base_commit; 1636 int nr_patch_id, alloc_patch_id; 1637 struct object_id *patch_id; 1638}; 1639 1640static struct commit *get_base_commit(const struct format_config *cfg, 1641 struct commit **list, 1642 size_t total) 1643{ 1644 struct commit *base = NULL; 1645 struct commit **rev; 1646 int auto_select, die_on_failure, ret; 1647 size_t i = 0, rev_nr = 0; 1648 1649 switch (cfg->auto_base) { 1650 case AUTO_BASE_NEVER: 1651 if (cfg->base_commit) { 1652 auto_select = 0; 1653 die_on_failure = 1; 1654 } else { 1655 /* no base information is requested */ 1656 return NULL; 1657 } 1658 break; 1659 case AUTO_BASE_ALWAYS: 1660 case AUTO_BASE_WHEN_ABLE: 1661 if (cfg->base_commit) { 1662 BUG("requested automatic base selection but a commit was provided"); 1663 } else { 1664 auto_select = 1; 1665 die_on_failure = cfg->auto_base == AUTO_BASE_ALWAYS; 1666 } 1667 break; 1668 default: 1669 BUG("unexpected automatic base selection method"); 1670 } 1671 1672 if (!auto_select) { 1673 base = lookup_commit_reference_by_name(cfg->base_commit); 1674 if (!base) 1675 die(_("unknown commit %s"), cfg->base_commit); 1676 } else { 1677 struct branch *curr_branch = branch_get(NULL); 1678 const char *upstream = branch_get_upstream(curr_branch, NULL); 1679 if (upstream) { 1680 struct commit_list *base_list = NULL; 1681 struct commit *commit; 1682 struct object_id oid; 1683 1684 if (repo_get_oid(the_repository, upstream, &oid)) { 1685 if (die_on_failure) 1686 die(_("failed to resolve '%s' as a valid ref"), upstream); 1687 else 1688 return NULL; 1689 } 1690 commit = lookup_commit_or_die(&oid, "upstream base"); 1691 if (repo_get_merge_bases_many(the_repository, 1692 commit, total, 1693 list, 1694 &base_list) < 0 || 1695 /* There should be one and only one merge base. */ 1696 !base_list || base_list->next) { 1697 if (die_on_failure) { 1698 die(_("could not find exact merge base")); 1699 } else { 1700 free_commit_list(base_list); 1701 return NULL; 1702 } 1703 } 1704 base = base_list->item; 1705 free_commit_list(base_list); 1706 } else { 1707 if (die_on_failure) 1708 die(_("failed to get upstream, if you want to record base commit automatically,\n" 1709 "please use git branch --set-upstream-to to track a remote branch.\n" 1710 "Or you could specify base commit by --base=<base-commit-id> manually")); 1711 else 1712 return NULL; 1713 } 1714 } 1715 1716 ALLOC_ARRAY(rev, total); 1717 for (i = 0; i < total; i++) 1718 rev[i] = list[i]; 1719 1720 rev_nr = total; 1721 /* 1722 * Get merge base through pair-wise computations 1723 * and store it in rev[0]. 1724 */ 1725 while (rev_nr > 1) { 1726 for (i = 0; i < rev_nr / 2; i++) { 1727 struct commit_list *merge_base = NULL; 1728 if (repo_get_merge_bases(the_repository, 1729 rev[2 * i], 1730 rev[2 * i + 1], &merge_base) < 0 || 1731 !merge_base || merge_base->next) { 1732 if (die_on_failure) { 1733 die(_("failed to find exact merge base")); 1734 } else { 1735 free_commit_list(merge_base); 1736 free(rev); 1737 return NULL; 1738 } 1739 } 1740 1741 rev[i] = merge_base->item; 1742 free_commit_list(merge_base); 1743 } 1744 1745 if (rev_nr % 2) 1746 rev[i] = rev[2 * i]; 1747 rev_nr = DIV_ROUND_UP(rev_nr, 2); 1748 } 1749 1750 ret = repo_in_merge_bases(the_repository, base, rev[0]); 1751 if (ret < 0) 1752 exit(128); 1753 if (!ret) { 1754 if (die_on_failure) { 1755 die(_("base commit should be the ancestor of revision list")); 1756 } else { 1757 free(rev); 1758 return NULL; 1759 } 1760 } 1761 1762 for (i = 0; i < total; i++) { 1763 if (base == list[i]) { 1764 if (die_on_failure) { 1765 die(_("base commit shouldn't be in revision list")); 1766 } else { 1767 free(rev); 1768 return NULL; 1769 } 1770 } 1771 } 1772 1773 free(rev); 1774 return base; 1775} 1776 1777define_commit_slab(commit_base, int); 1778 1779static void prepare_bases(struct base_tree_info *bases, 1780 struct commit *base, 1781 struct commit **list, 1782 size_t total) 1783{ 1784 struct commit *commit; 1785 struct rev_info revs; 1786 struct diff_options diffopt; 1787 struct commit_base commit_base; 1788 1789 if (!base) 1790 return; 1791 1792 init_commit_base(&commit_base); 1793 repo_diff_setup(the_repository, &diffopt); 1794 diffopt.flags.recursive = 1; 1795 diff_setup_done(&diffopt); 1796 1797 oidcpy(&bases->base_commit, &base->object.oid); 1798 1799 repo_init_revisions(the_repository, &revs, NULL); 1800 revs.max_parents = 1; 1801 revs.topo_order = 1; 1802 for (size_t i = 0; i < total; i++) { 1803 list[i]->object.flags &= ~UNINTERESTING; 1804 add_pending_object(&revs, &list[i]->object, "rev_list"); 1805 *commit_base_at(&commit_base, list[i]) = 1; 1806 } 1807 base->object.flags |= UNINTERESTING; 1808 add_pending_object(&revs, &base->object, "base"); 1809 1810 if (prepare_revision_walk(&revs)) 1811 die(_("revision walk setup failed")); 1812 /* 1813 * Traverse the commits list, get prerequisite patch ids 1814 * and stuff them in bases structure. 1815 */ 1816 while ((commit = get_revision(&revs)) != NULL) { 1817 struct object_id oid; 1818 struct object_id *patch_id; 1819 if (*commit_base_at(&commit_base, commit)) 1820 continue; 1821 if (commit_patch_id(commit, &diffopt, &oid, 0)) 1822 die(_("cannot get patch id")); 1823 ALLOC_GROW(bases->patch_id, bases->nr_patch_id + 1, bases->alloc_patch_id); 1824 patch_id = bases->patch_id + bases->nr_patch_id; 1825 oidcpy(patch_id, &oid); 1826 bases->nr_patch_id++; 1827 } 1828 clear_commit_base(&commit_base); 1829} 1830 1831static void print_bases(struct base_tree_info *bases, FILE *file) 1832{ 1833 int i; 1834 1835 /* Only do this once, either for the cover or for the first one */ 1836 if (is_null_oid(&bases->base_commit)) 1837 return; 1838 1839 /* Show the base commit */ 1840 fprintf(file, "\nbase-commit: %s\n", oid_to_hex(&bases->base_commit)); 1841 1842 /* Show the prerequisite patches */ 1843 for (i = bases->nr_patch_id - 1; i >= 0; i--) 1844 fprintf(file, "prerequisite-patch-id: %s\n", oid_to_hex(&bases->patch_id[i])); 1845 1846 free(bases->patch_id); 1847 bases->nr_patch_id = 0; 1848 bases->alloc_patch_id = 0; 1849 oidclr(&bases->base_commit, the_repository->hash_algo); 1850} 1851 1852static const char *diff_title(struct strbuf *sb, 1853 const char *reroll_count, 1854 const char *generic, 1855 const char *rerolled) 1856{ 1857 int v; 1858 1859 /* RFC may be v0, so allow -v1 to diff against v0 */ 1860 if (reroll_count && !strtol_i(reroll_count, 10, &v) && 1861 v >= 1) 1862 strbuf_addf(sb, rerolled, v - 1); 1863 else 1864 strbuf_addstr(sb, generic); 1865 return sb->buf; 1866} 1867 1868static void infer_range_diff_ranges(struct strbuf *r1, 1869 struct strbuf *r2, 1870 const char *prev, 1871 struct commit *origin, 1872 struct commit *head) 1873{ 1874 const char *head_oid = oid_to_hex(&head->object.oid); 1875 int prev_is_range = is_range_diff_range(prev); 1876 1877 if (prev_is_range) 1878 strbuf_addstr(r1, prev); 1879 else 1880 strbuf_addf(r1, "%s..%s", head_oid, prev); 1881 1882 if (origin) 1883 strbuf_addf(r2, "%s..%s", oid_to_hex(&origin->object.oid), head_oid); 1884 else if (prev_is_range) 1885 die(_("failed to infer range-diff origin of current series")); 1886 else { 1887 warning(_("using '%s' as range-diff origin of current series"), prev); 1888 strbuf_addf(r2, "%s..%s", prev, head_oid); 1889 } 1890} 1891 1892int cmd_format_patch(int argc, 1893 const char **argv, 1894 const char *prefix, 1895 struct repository *repo UNUSED) 1896{ 1897 struct format_config cfg; 1898 struct commit *commit; 1899 struct commit **list = NULL; 1900 struct rev_info rev; 1901 char *to_free = NULL; 1902 struct setup_revision_opt s_r_opt; 1903 size_t nr = 0, total, i; 1904 int use_stdout = 0; 1905 int start_number = -1; 1906 int just_numbers = 0; 1907 int ignore_if_in_upstream = 0; 1908 int cover_letter = -1; 1909 int boundary_count = 0; 1910 int no_binary_diff = 0; 1911 int zero_commit = 0; 1912 struct commit *origin = NULL; 1913 const char *in_reply_to = NULL; 1914 struct patch_ids ids; 1915 struct strbuf buf = STRBUF_INIT; 1916 int use_patch_format = 0; 1917 int quiet = 0; 1918 const char *reroll_count = NULL; 1919 char *cover_from_description_arg = NULL; 1920 char *description_file = NULL; 1921 char *branch_name = NULL; 1922 struct base_tree_info bases; 1923 struct commit *base; 1924 int show_progress = 0; 1925 struct progress *progress = NULL; 1926 struct oid_array idiff_prev = OID_ARRAY_INIT; 1927 struct strbuf idiff_title = STRBUF_INIT; 1928 const char *rdiff_prev = NULL; 1929 struct strbuf rdiff1 = STRBUF_INIT; 1930 struct strbuf rdiff2 = STRBUF_INIT; 1931 struct strbuf rdiff_title = STRBUF_INIT; 1932 const char *rfc = NULL; 1933 int creation_factor = -1; 1934 const char *signature = git_version_string; 1935 char *signature_to_free = NULL; 1936 char *signature_file_arg = NULL; 1937 struct keep_callback_data keep_callback_data = { 1938 .cfg = &cfg, 1939 .revs = &rev, 1940 }; 1941 const char *fmt_patch_suffix = NULL; 1942 1943 const struct option builtin_format_patch_options[] = { 1944 OPT_CALLBACK_F('n', "numbered", &cfg, NULL, 1945 N_("use [PATCH n/m] even with a single patch"), 1946 PARSE_OPT_NOARG, numbered_callback), 1947 OPT_CALLBACK_F('N', "no-numbered", &cfg, NULL, 1948 N_("use [PATCH] even with multiple patches"), 1949 PARSE_OPT_NOARG | PARSE_OPT_NONEG, no_numbered_callback), 1950 OPT_BOOL('s', "signoff", &cfg.do_signoff, N_("add a Signed-off-by trailer")), 1951 OPT_BOOL(0, "stdout", &use_stdout, 1952 N_("print patches to standard out")), 1953 OPT_BOOL(0, "cover-letter", &cover_letter, 1954 N_("generate a cover letter")), 1955 OPT_BOOL(0, "numbered-files", &just_numbers, 1956 N_("use simple number sequence for output file names")), 1957 OPT_STRING(0, "suffix", &fmt_patch_suffix, N_("sfx"), 1958 N_("use <sfx> instead of '.patch'")), 1959 OPT_INTEGER(0, "start-number", &start_number, 1960 N_("start numbering patches at <n> instead of 1")), 1961 OPT_STRING('v', "reroll-count", &reroll_count, N_("reroll-count"), 1962 N_("mark the series as Nth re-roll")), 1963 OPT_INTEGER(0, "filename-max-length", &cfg.log.fmt_patch_name_max, 1964 N_("max length of output filename")), 1965 OPT_CALLBACK_F(0, "rfc", &rfc, N_("rfc"), 1966 N_("add <rfc> (default 'RFC') before 'PATCH'"), 1967 PARSE_OPT_OPTARG, rfc_callback), 1968 OPT_STRING(0, "cover-from-description", &cover_from_description_arg, 1969 N_("cover-from-description-mode"), 1970 N_("generate parts of a cover letter based on a branch's description")), 1971 OPT_FILENAME(0, "description-file", &description_file, 1972 N_("use branch description from file")), 1973 OPT_CALLBACK_F(0, "subject-prefix", &cfg, N_("prefix"), 1974 N_("use [<prefix>] instead of [PATCH]"), 1975 PARSE_OPT_NONEG, subject_prefix_callback), 1976 OPT_CALLBACK_F('o', "output-directory", &output_directory, 1977 N_("dir"), N_("store resulting files in <dir>"), 1978 PARSE_OPT_NONEG, output_directory_callback), 1979 OPT_CALLBACK_F('k', "keep-subject", &keep_callback_data, NULL, 1980 N_("don't strip/add [PATCH]"), 1981 PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback), 1982 OPT_BOOL(0, "no-binary", &no_binary_diff, 1983 N_("don't output binary diffs")), 1984 OPT_BOOL(0, "zero-commit", &zero_commit, 1985 N_("output all-zero hash in From header")), 1986 OPT_BOOL(0, "ignore-if-in-upstream", &ignore_if_in_upstream, 1987 N_("don't include a patch matching a commit upstream")), 1988 OPT_SET_INT_F('p', "no-stat", &use_patch_format, 1989 N_("show patch format instead of default (patch + stat)"), 1990 1, PARSE_OPT_NONEG), 1991 OPT_GROUP(N_("Messaging")), 1992 OPT_CALLBACK(0, "add-header", &cfg, N_("header"), 1993 N_("add email header"), header_callback), 1994 OPT_STRING_LIST(0, "to", &cfg.extra_to, N_("email"), N_("add To: header")), 1995 OPT_STRING_LIST(0, "cc", &cfg.extra_cc, N_("email"), N_("add Cc: header")), 1996 OPT_CALLBACK_F(0, "from", &cfg.from, N_("ident"), 1997 N_("set From address to <ident> (or committer ident if absent)"), 1998 PARSE_OPT_OPTARG, from_callback), 1999 OPT_STRING(0, "in-reply-to", &in_reply_to, N_("message-id"), 2000 N_("make first mail a reply to <message-id>")), 2001 OPT_CALLBACK_F(0, "attach", &rev, N_("boundary"), 2002 N_("attach the patch"), PARSE_OPT_OPTARG, 2003 attach_callback), 2004 OPT_CALLBACK_F(0, "inline", &rev, N_("boundary"), 2005 N_("inline the patch"), 2006 PARSE_OPT_OPTARG | PARSE_OPT_NONEG, 2007 inline_callback), 2008 OPT_CALLBACK_F(0, "thread", &cfg, N_("style"), 2009 N_("enable message threading, styles: shallow, deep"), 2010 PARSE_OPT_OPTARG, thread_callback), 2011 OPT_STRING(0, "signature", &signature, N_("signature"), 2012 N_("add a signature")), 2013 OPT_CALLBACK_F(0, "base", &cfg, N_("base-commit"), 2014 N_("add prerequisite tree info to the patch series"), 2015 0, base_callback), 2016 OPT_FILENAME(0, "signature-file", &signature_file_arg, 2017 N_("add a signature from a file")), 2018 OPT__QUIET(&quiet, N_("don't print the patch filenames")), 2019 OPT_BOOL(0, "progress", &show_progress, 2020 N_("show progress while generating patches")), 2021 OPT_CALLBACK(0, "interdiff", &idiff_prev, N_("rev"), 2022 N_("show changes against <rev> in cover letter or single patch"), 2023 parse_opt_object_name), 2024 OPT_STRING(0, "range-diff", &rdiff_prev, N_("refspec"), 2025 N_("show changes against <refspec> in cover letter or single patch")), 2026 OPT_INTEGER(0, "creation-factor", &creation_factor, 2027 N_("percentage by which creation is weighted")), 2028 OPT_BOOL(0, "force-in-body-from", &force_in_body_from, 2029 N_("show in-body From: even if identical to the e-mail header")), 2030 OPT_END() 2031 }; 2032 2033 format_config_init(&cfg); 2034 init_diff_ui_defaults(); 2035 init_display_notes(&cfg.notes_opt); 2036 repo_config(the_repository, git_format_config, &cfg); 2037 repo_init_revisions(the_repository, &rev, prefix); 2038 repo_config(the_repository, grep_config, &rev.grep_filter); 2039 2040 rev.show_notes = cfg.show_notes; 2041 memcpy(&rev.notes_opt, &cfg.notes_opt, sizeof(cfg.notes_opt)); 2042 rev.commit_format = CMIT_FMT_EMAIL; 2043 rev.encode_email_headers = cfg.log.default_encode_email_headers; 2044 rev.expand_tabs_in_log_default = 0; 2045 rev.verbose_header = 1; 2046 rev.diff = 1; 2047 rev.max_parents = 1; 2048 rev.diffopt.flags.recursive = 1; 2049 rev.diffopt.no_free = 1; 2050 memset(&s_r_opt, 0, sizeof(s_r_opt)); 2051 s_r_opt.def = "HEAD"; 2052 s_r_opt.revarg_opt = REVARG_COMMITTISH; 2053 2054 strbuf_addstr(&cfg.sprefix, cfg.log.fmt_patch_subject_prefix); 2055 if (format_no_prefix) 2056 diff_set_noprefix(&rev.diffopt); 2057 2058 if (cfg.default_attach) { 2059 rev.mime_boundary = cfg.default_attach; 2060 rev.no_inline = 1; 2061 } 2062 2063 /* 2064 * Parse the arguments before setup_revisions(), or something 2065 * like "git format-patch -o a123 HEAD^.." may fail; a123 is 2066 * possibly a valid SHA1. 2067 */ 2068 argc = parse_options(argc, argv, prefix, builtin_format_patch_options, 2069 builtin_format_patch_usage, 2070 PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT | 2071 PARSE_OPT_KEEP_DASHDASH); 2072 2073 rev.force_in_body_from = force_in_body_from; 2074 2075 if (!fmt_patch_suffix) 2076 fmt_patch_suffix = cfg.fmt_patch_suffix; 2077 2078 /* Make sure "0000-$sub.patch" gives non-negative length for $sub */ 2079 if (cfg.log.fmt_patch_name_max <= cast_size_t_to_int(strlen("0000-") + strlen(fmt_patch_suffix))) 2080 cfg.log.fmt_patch_name_max = strlen("0000-") + strlen(fmt_patch_suffix); 2081 2082 if (cover_from_description_arg) 2083 cfg.cover_from_description_mode = parse_cover_from_description(cover_from_description_arg); 2084 2085 if (rfc && rfc[0]) { 2086 cfg.subject_prefix = 1; 2087 if (rfc[0] == '-') 2088 strbuf_addf(&cfg.sprefix, " %s", rfc + 1); 2089 else 2090 strbuf_insertf(&cfg.sprefix, 0, "%s ", rfc); 2091 } 2092 2093 if (reroll_count) { 2094 strbuf_addf(&cfg.sprefix, " v%s", reroll_count); 2095 rev.reroll_count = reroll_count; 2096 } 2097 2098 rev.subject_prefix = cfg.sprefix.buf; 2099 2100 for (i = 0; i < cfg.extra_hdr.nr; i++) { 2101 strbuf_addstr(&buf, cfg.extra_hdr.items[i].string); 2102 strbuf_addch(&buf, '\n'); 2103 } 2104 2105 if (cfg.extra_to.nr) 2106 strbuf_addstr(&buf, "To: "); 2107 for (i = 0; i < cfg.extra_to.nr; i++) { 2108 if (i) 2109 strbuf_addstr(&buf, " "); 2110 strbuf_addstr(&buf, cfg.extra_to.items[i].string); 2111 if (i + 1 < cfg.extra_to.nr) 2112 strbuf_addch(&buf, ','); 2113 strbuf_addch(&buf, '\n'); 2114 } 2115 2116 if (cfg.extra_cc.nr) 2117 strbuf_addstr(&buf, "Cc: "); 2118 for (i = 0; i < cfg.extra_cc.nr; i++) { 2119 if (i) 2120 strbuf_addstr(&buf, " "); 2121 strbuf_addstr(&buf, cfg.extra_cc.items[i].string); 2122 if (i + 1 < cfg.extra_cc.nr) 2123 strbuf_addch(&buf, ','); 2124 strbuf_addch(&buf, '\n'); 2125 } 2126 2127 rev.extra_headers = to_free = strbuf_detach(&buf, NULL); 2128 2129 if (cfg.from) { 2130 if (split_ident_line(&rev.from_ident, cfg.from, strlen(cfg.from))) 2131 die(_("invalid ident line: %s"), cfg.from); 2132 } 2133 2134 if (start_number < 0) 2135 start_number = 1; 2136 2137 /* 2138 * If numbered is set solely due to format.numbered in config, 2139 * and it would conflict with --keep-subject (-k) from the 2140 * command line, reset "numbered". 2141 */ 2142 if (cfg.numbered && cfg.keep_subject && !cfg.numbered_cmdline_opt) 2143 cfg.numbered = 0; 2144 2145 if (cfg.numbered && cfg.keep_subject) 2146 die(_("options '%s' and '%s' cannot be used together"), "-n", "-k"); 2147 if (cfg.keep_subject && cfg.subject_prefix) 2148 die(_("options '%s' and '%s' cannot be used together"), "--subject-prefix/--rfc", "-k"); 2149 rev.preserve_subject = cfg.keep_subject; 2150 2151 argc = setup_revisions(argc, argv, &rev, &s_r_opt); 2152 if (argc > 1) 2153 die(_("unrecognized argument: %s"), argv[1]); 2154 2155 if (rev.diffopt.output_format & DIFF_FORMAT_NAME) 2156 die(_("--name-only does not make sense")); 2157 if (rev.diffopt.output_format & DIFF_FORMAT_NAME_STATUS) 2158 die(_("--name-status does not make sense")); 2159 if (rev.diffopt.output_format & DIFF_FORMAT_CHECKDIFF) 2160 die(_("--check does not make sense")); 2161 if (rev.remerge_diff) 2162 die(_("--remerge-diff does not make sense")); 2163 2164 if (!use_patch_format && 2165 (!rev.diffopt.output_format || 2166 rev.diffopt.output_format == DIFF_FORMAT_PATCH)) 2167 rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY; 2168 if (!rev.diffopt.stat_width) 2169 rev.diffopt.stat_width = MAIL_DEFAULT_WRAP; 2170 2171 /* Always generate a patch */ 2172 rev.diffopt.output_format |= DIFF_FORMAT_PATCH; 2173 rev.always_show_header = 1; 2174 2175 rev.zero_commit = zero_commit; 2176 rev.patch_name_max = cfg.log.fmt_patch_name_max; 2177 2178 if (!rev.diffopt.flags.text && !no_binary_diff) 2179 rev.diffopt.flags.binary = 1; 2180 2181 if (rev.show_notes) 2182 load_display_notes(&rev.notes_opt); 2183 2184 die_for_incompatible_opt3(use_stdout, "--stdout", 2185 rev.diffopt.close_file, "--output", 2186 !!output_directory, "--output-directory"); 2187 2188 if (use_stdout && stdout_mboxrd) 2189 rev.commit_format = CMIT_FMT_MBOXRD; 2190 2191 if (use_stdout) { 2192 setup_pager(the_repository); 2193 } else if (!rev.diffopt.close_file) { 2194 int saved; 2195 2196 if (!output_directory) 2197 output_directory = cfg.config_output_directory; 2198 output_directory = set_outdir(prefix, output_directory); 2199 2200 if (rev.diffopt.use_color != GIT_COLOR_ALWAYS) 2201 rev.diffopt.use_color = GIT_COLOR_NEVER; 2202 /* 2203 * We consider <outdir> as 'outside of gitdir', therefore avoid 2204 * applying adjust_shared_perm in s-c-l-d. 2205 */ 2206 saved = repo_settings_get_shared_repository(the_repository); 2207 repo_settings_set_shared_repository(the_repository, 0); 2208 switch (safe_create_leading_directories_const(the_repository, output_directory)) { 2209 case SCLD_OK: 2210 case SCLD_EXISTS: 2211 break; 2212 default: 2213 die(_("could not create leading directories " 2214 "of '%s'"), output_directory); 2215 } 2216 repo_settings_set_shared_repository(the_repository, saved); 2217 if (mkdir(output_directory, 0777) < 0 && errno != EEXIST) 2218 die_errno(_("could not create directory '%s'"), 2219 output_directory); 2220 } 2221 2222 if (rev.pending.nr == 1) { 2223 int check_head = 0; 2224 2225 if (rev.max_count < 0 && !rev.show_root_diff) { 2226 /* 2227 * This is traditional behaviour of "git format-patch 2228 * origin" that prepares what the origin side still 2229 * does not have. 2230 */ 2231 rev.pending.objects[0].item->flags |= UNINTERESTING; 2232 add_head_to_pending(&rev); 2233 check_head = 1; 2234 } 2235 /* 2236 * Otherwise, it is "format-patch -22 HEAD", and/or 2237 * "format-patch --root HEAD". The user wants 2238 * get_revision() to do the usual traversal. 2239 */ 2240 2241 if (!strcmp(rev.pending.objects[0].name, "HEAD")) 2242 check_head = 1; 2243 2244 if (check_head) { 2245 const char *ref, *v; 2246 ref = refs_resolve_ref_unsafe(get_main_ref_store(the_repository), 2247 "HEAD", 2248 RESOLVE_REF_READING, 2249 NULL, NULL); 2250 if (ref && skip_prefix(ref, "refs/heads/", &v)) 2251 branch_name = xstrdup(v); 2252 else 2253 branch_name = xstrdup(""); /* no branch */ 2254 } 2255 } 2256 2257 /* 2258 * We cannot move this anywhere earlier because we do want to 2259 * know if --root was given explicitly from the command line. 2260 */ 2261 rev.show_root_diff = 1; 2262 2263 if (ignore_if_in_upstream) { 2264 /* Don't say anything if head and upstream are the same. */ 2265 if (rev.pending.nr == 2) { 2266 struct object_array_entry *o = rev.pending.objects; 2267 if (oideq(&o[0].item->oid, &o[1].item->oid)) 2268 goto done; 2269 } 2270 get_patch_ids(&rev, &ids); 2271 } 2272 2273 if (prepare_revision_walk(&rev)) 2274 die(_("revision walk setup failed")); 2275 rev.boundary = 1; 2276 while ((commit = get_revision(&rev)) != NULL) { 2277 if (commit->object.flags & BOUNDARY) { 2278 boundary_count++; 2279 origin = (boundary_count == 1) ? commit : NULL; 2280 continue; 2281 } 2282 2283 if (ignore_if_in_upstream && has_commit_patch_id(commit, &ids)) 2284 continue; 2285 2286 nr++; 2287 REALLOC_ARRAY(list, nr); 2288 list[nr - 1] = commit; 2289 } 2290 if (nr == 0) 2291 /* nothing to do */ 2292 goto done; 2293 total = nr; 2294 if (cover_letter == -1) { 2295 if (cfg.config_cover_letter == COVER_AUTO) 2296 cover_letter = (total > 1); 2297 else if ((idiff_prev.nr || rdiff_prev) && (total > 1)) 2298 cover_letter = (cfg.config_cover_letter != COVER_OFF); 2299 else 2300 cover_letter = (cfg.config_cover_letter == COVER_ON); 2301 } 2302 if (!cfg.keep_subject && cfg.auto_number && (total > 1 || cover_letter)) 2303 cfg.numbered = 1; 2304 if (cfg.numbered) 2305 rev.total = total + start_number - 1; 2306 2307 if (idiff_prev.nr) { 2308 if (!cover_letter && total != 1) 2309 die(_("--interdiff requires --cover-letter or single patch")); 2310 rev.idiff_oid1 = &idiff_prev.oid[idiff_prev.nr - 1]; 2311 rev.idiff_oid2 = get_commit_tree_oid(list[0]); 2312 rev.idiff_title = diff_title(&idiff_title, reroll_count, 2313 _("Interdiff:"), 2314 _("Interdiff against v%d:")); 2315 } 2316 2317 if (creation_factor < 0) 2318 creation_factor = CREATION_FACTOR_FOR_THE_SAME_SERIES; 2319 else if (!rdiff_prev) 2320 die(_("the option '%s' requires '%s'"), "--creation-factor", "--range-diff"); 2321 2322 if (rdiff_prev) { 2323 if (!cover_letter && total != 1) 2324 die(_("--range-diff requires --cover-letter or single patch")); 2325 2326 infer_range_diff_ranges(&rdiff1, &rdiff2, rdiff_prev, 2327 origin, list[0]); 2328 rev.rdiff1 = rdiff1.buf; 2329 rev.rdiff2 = rdiff2.buf; 2330 rev.creation_factor = creation_factor; 2331 rev.rdiff_title = diff_title(&rdiff_title, reroll_count, 2332 _("Range-diff:"), 2333 _("Range-diff against v%d:")); 2334 get_notes_args(&(rev.rdiff_log_arg), &rev); 2335 } 2336 2337 /* 2338 * The order of precedence is: 2339 * 2340 * 1. The `--signature` and `--no-signature` options. 2341 * 2. The `--signature-file` option. 2342 * 3. The `format.signature` config. 2343 * 4. The `format.signatureFile` config. 2344 * 5. Default `git_version_string`. 2345 */ 2346 if (!signature) { 2347 ; /* --no-signature inhibits all signatures */ 2348 } else if (signature && signature != git_version_string) { 2349 ; /* non-default signature already set */ 2350 } else if (signature_file_arg || (cfg.signature_file && !cfg.signature)) { 2351 struct strbuf buf = STRBUF_INIT; 2352 const char *signature_file = signature_file_arg ? 2353 signature_file_arg : cfg.signature_file; 2354 2355 if (strbuf_read_file(&buf, signature_file, 128) < 0) 2356 die_errno(_("unable to read signature file '%s'"), signature_file); 2357 signature = signature_to_free = strbuf_detach(&buf, NULL); 2358 } else if (cfg.signature) { 2359 signature = cfg.signature; 2360 } 2361 2362 memset(&bases, 0, sizeof(bases)); 2363 base = get_base_commit(&cfg, list, nr); 2364 if (base) { 2365 reset_revision_walk(); 2366 clear_object_flags(the_repository, UNINTERESTING); 2367 prepare_bases(&bases, base, list, nr); 2368 } 2369 2370 if (in_reply_to || cfg.thread || cover_letter) { 2371 rev.ref_message_ids = xmalloc(sizeof(*rev.ref_message_ids)); 2372 string_list_init_dup(rev.ref_message_ids); 2373 } 2374 if (in_reply_to) { 2375 char *msgid = clean_message_id(in_reply_to); 2376 string_list_append_nodup(rev.ref_message_ids, msgid); 2377 } 2378 rev.numbered_files = just_numbers; 2379 rev.patch_suffix = fmt_patch_suffix; 2380 if (cover_letter) { 2381 if (cfg.thread) 2382 gen_message_id(&rev, "cover"); 2383 make_cover_letter(&rev, !!output_directory, 2384 origin, nr, list, description_file, branch_name, quiet, &cfg); 2385 print_bases(&bases, rev.diffopt.file); 2386 print_signature(signature, rev.diffopt.file); 2387 total++; 2388 start_number--; 2389 /* interdiff/range-diff in cover-letter; omit from patches */ 2390 rev.idiff_oid1 = NULL; 2391 rev.rdiff1 = NULL; 2392 } 2393 rev.add_signoff = cfg.do_signoff; 2394 2395 if (show_progress) 2396 progress = start_delayed_progress(the_repository, 2397 _("Generating patches"), total); 2398 for (i = 0; i < nr; i++) { 2399 size_t idx = nr - i - 1; 2400 int shown; 2401 2402 display_progress(progress, total - idx); 2403 commit = list[idx]; 2404 rev.nr = total - idx + (start_number - 1); 2405 2406 /* Make the second and subsequent mails replies to the first */ 2407 if (cfg.thread) { 2408 /* Have we already had a message ID? */ 2409 if (rev.message_id) { 2410 /* 2411 * For deep threading: make every mail 2412 * a reply to the previous one, no 2413 * matter what other options are set. 2414 * 2415 * For shallow threading: 2416 * 2417 * Without --cover-letter and 2418 * --in-reply-to, make every mail a 2419 * reply to the one before. 2420 * 2421 * With --in-reply-to but no 2422 * --cover-letter, make every mail a 2423 * reply to the <reply-to>. 2424 * 2425 * With --cover-letter, make every 2426 * mail but the cover letter a reply 2427 * to the cover letter. The cover 2428 * letter is a reply to the 2429 * --in-reply-to, if specified. 2430 */ 2431 if (cfg.thread == THREAD_SHALLOW 2432 && rev.ref_message_ids->nr > 0 2433 && (!cover_letter || rev.nr > 1)) 2434 free(rev.message_id); 2435 else 2436 string_list_append_nodup(rev.ref_message_ids, 2437 rev.message_id); 2438 } 2439 gen_message_id(&rev, oid_to_hex(&commit->object.oid)); 2440 } 2441 2442 if (output_directory && 2443 open_next_file(rev.numbered_files ? NULL : commit, NULL, &rev, quiet)) 2444 die(_("failed to create output files")); 2445 shown = log_tree_commit(&rev, commit); 2446 free_commit_buffer(the_repository->parsed_objects, 2447 commit); 2448 2449 /* We put one extra blank line between formatted 2450 * patches and this flag is used by log-tree code 2451 * to see if it needs to emit a LF before showing 2452 * the log; when using one file per patch, we do 2453 * not want the extra blank line. 2454 */ 2455 if (output_directory) 2456 rev.shown_one = 0; 2457 if (shown) { 2458 print_bases(&bases, rev.diffopt.file); 2459 if (rev.mime_boundary) 2460 fprintf(rev.diffopt.file, "\n--%s%s--\n\n\n", 2461 mime_boundary_leader, 2462 rev.mime_boundary); 2463 else 2464 print_signature(signature, rev.diffopt.file); 2465 } 2466 if (output_directory) { 2467 fclose(rev.diffopt.file); 2468 rev.diffopt.file = NULL; 2469 } 2470 } 2471 stop_progress(&progress); 2472 free(list); 2473 if (ignore_if_in_upstream) 2474 free_patch_ids(&ids); 2475 2476done: 2477 oid_array_clear(&idiff_prev); 2478 strbuf_release(&idiff_title); 2479 strbuf_release(&rdiff1); 2480 strbuf_release(&rdiff2); 2481 strbuf_release(&rdiff_title); 2482 free(description_file); 2483 free(signature_file_arg); 2484 free(signature_to_free); 2485 free(branch_name); 2486 free(to_free); 2487 free(rev.message_id); 2488 if (rev.ref_message_ids) 2489 string_list_clear(rev.ref_message_ids, 0); 2490 free(rev.ref_message_ids); 2491 rev.diffopt.no_free = 0; 2492 release_revisions(&rev); 2493 format_config_release(&cfg); 2494 strvec_clear(&rev.rdiff_log_arg); 2495 return 0; 2496} 2497 2498static int add_pending_commit(const char *arg, struct rev_info *revs, int flags) 2499{ 2500 struct object_id oid; 2501 if (repo_get_oid(the_repository, arg, &oid) == 0) { 2502 struct commit *commit = lookup_commit_reference(the_repository, 2503 &oid); 2504 if (commit) { 2505 commit->object.flags |= flags; 2506 add_pending_object(revs, &commit->object, arg); 2507 return 0; 2508 } 2509 } 2510 return -1; 2511} 2512 2513static const char * const cherry_usage[] = { 2514 N_("git cherry [-v] [<upstream> [<head> [<limit>]]]"), 2515 NULL 2516}; 2517 2518static void print_commit(char sign, struct commit *commit, int verbose, 2519 int abbrev, FILE *file) 2520{ 2521 if (!verbose) { 2522 fprintf(file, "%c %s\n", sign, 2523 repo_find_unique_abbrev(the_repository, &commit->object.oid, abbrev)); 2524 } else { 2525 struct strbuf buf = STRBUF_INIT; 2526 pp_commit_easy(CMIT_FMT_ONELINE, commit, &buf); 2527 fprintf(file, "%c %s %s\n", sign, 2528 repo_find_unique_abbrev(the_repository, &commit->object.oid, abbrev), 2529 buf.buf); 2530 strbuf_release(&buf); 2531 } 2532} 2533 2534int cmd_cherry(int argc, 2535 const char **argv, 2536 const char *prefix, 2537 struct repository *repo UNUSED) 2538{ 2539 struct rev_info revs; 2540 struct patch_ids ids; 2541 struct commit *commit; 2542 struct commit_list *list = NULL; 2543 struct branch *current_branch; 2544 const char *upstream; 2545 const char *head = "HEAD"; 2546 const char *limit = NULL; 2547 int verbose = 0, abbrev = 0; 2548 2549 struct option options[] = { 2550 OPT__ABBREV(&abbrev), 2551 OPT__VERBOSE(&verbose, N_("be verbose")), 2552 OPT_END() 2553 }; 2554 2555 argc = parse_options(argc, argv, prefix, options, cherry_usage, 0); 2556 2557 switch (argc) { 2558 case 3: 2559 limit = argv[2]; 2560 /* FALLTHROUGH */ 2561 case 2: 2562 head = argv[1]; 2563 /* FALLTHROUGH */ 2564 case 1: 2565 upstream = argv[0]; 2566 break; 2567 default: 2568 current_branch = branch_get(NULL); 2569 upstream = branch_get_upstream(current_branch, NULL); 2570 if (!upstream) { 2571 fprintf(stderr, _("Could not find a tracked" 2572 " remote branch, please" 2573 " specify <upstream> manually.\n")); 2574 usage_with_options(cherry_usage, options); 2575 } 2576 } 2577 2578 repo_init_revisions(the_repository, &revs, prefix); 2579 revs.max_parents = 1; 2580 2581 if (add_pending_commit(head, &revs, 0)) 2582 die(_("unknown commit %s"), head); 2583 if (add_pending_commit(upstream, &revs, UNINTERESTING)) 2584 die(_("unknown commit %s"), upstream); 2585 2586 /* Don't say anything if head and upstream are the same. */ 2587 if (revs.pending.nr == 2) { 2588 struct object_array_entry *o = revs.pending.objects; 2589 if (oideq(&o[0].item->oid, &o[1].item->oid)) 2590 return 0; 2591 } 2592 2593 get_patch_ids(&revs, &ids); 2594 2595 if (limit && add_pending_commit(limit, &revs, UNINTERESTING)) 2596 die(_("unknown commit %s"), limit); 2597 2598 /* reverse the list of commits */ 2599 if (prepare_revision_walk(&revs)) 2600 die(_("revision walk setup failed")); 2601 while ((commit = get_revision(&revs)) != NULL) { 2602 commit_list_insert(commit, &list); 2603 } 2604 2605 for (struct commit_list *l = list; l; l = l->next) { 2606 char sign = '+'; 2607 2608 commit = l->item; 2609 if (has_commit_patch_id(commit, &ids)) 2610 sign = '-'; 2611 print_commit(sign, commit, verbose, abbrev, revs.diffopt.file); 2612 } 2613 2614 free_commit_list(list); 2615 free_patch_ids(&ids); 2616 return 0; 2617}