log.c 41.6 KB
Newer Older
1 2 3 4 5 6 7
/*
 * Builtin "git log" and related commands (show, whatchanged)
 *
 * (C) Copyright 2006 Linus Torvalds
 *		 2006 Junio Hamano
 */
#include "cache.h"
8
#include "color.h"
9 10 11 12
#include "commit.h"
#include "diff.h"
#include "revision.h"
#include "log-tree.h"
13
#include "builtin.h"
14
#include "tag.h"
L
Linus Torvalds 已提交
15
#include "reflog-walk.h"
16
#include "patch-ids.h"
17
#include "run-command.h"
18
#include "shortlog.h"
19
#include "remote.h"
20
#include "string-list.h"
21
#include "parse-options.h"
22
#include "branch.h"
23
#include "streaming.h"
24
#include "version.h"
A
Antoine Pelisse 已提交
25
#include "mailmap.h"
26

H
Heikki Orsila 已提交
27 28 29
/* Set a default date-time format for git log ("log.date" config variable) */
static const char *default_date_mode = NULL;

30
static int default_abbrev_commit;
31
static int default_show_root = 1;
J
Junio C Hamano 已提交
32
static int decoration_style;
33
static int decoration_given;
34
static int use_mailmap_config;
35
static const char *fmt_patch_subject_prefix = "PATCH";
36
static const char *fmt_pretty;
37

38
static const char * const builtin_log_usage[] = {
39 40
	N_("git log [<options>] [<since>..<until>] [[--] <path>...]\n")
	N_("   or: git show [options] <object>..."),
41 42
	NULL
};
43

J
Junio C Hamano 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
static int parse_decoration_style(const char *var, const char *value)
{
	switch (git_config_maybe_bool(var, value)) {
	case 1:
		return DECORATE_SHORT_REFS;
	case 0:
		return 0;
	default:
		break;
	}
	if (!strcmp(value, "full"))
		return DECORATE_FULL_REFS;
	else if (!strcmp(value, "short"))
		return DECORATE_SHORT_REFS;
	return -1;
}

61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
static int decorate_callback(const struct option *opt, const char *arg, int unset)
{
	if (unset)
		decoration_style = 0;
	else if (arg)
		decoration_style = parse_decoration_style("command line", arg);
	else
		decoration_style = DECORATE_SHORT_REFS;

	if (decoration_style < 0)
		die("invalid --decorate option: %s", arg);

	decoration_given = 1;

	return 0;
}

78
static void cmd_log_init_defaults(struct rev_info *rev)
79
{
80
	if (fmt_pretty)
81
		get_commit_format(fmt_pretty, rev);
82
	rev->verbose_header = 1;
83
	DIFF_OPT_SET(&rev->diffopt, RECURSIVE);
84
	rev->diffopt.stat_width = -1; /* use full terminal width */
85
	rev->diffopt.stat_graph_width = -1; /* respect statGraphWidth config */
86
	rev->abbrev_commit = default_abbrev_commit;
87
	rev->show_root_diff = default_show_root;
88
	rev->subject_prefix = fmt_patch_subject_prefix;
J
Jeff King 已提交
89
	DIFF_OPT_SET(&rev->diffopt, ALLOW_TEXTCONV);
H
Heikki Orsila 已提交
90 91 92

	if (default_date_mode)
		rev->date_mode = parse_date_format(default_date_mode);
93
}
H
Heikki Orsila 已提交
94

95 96 97 98
static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
			 struct rev_info *rev, struct setup_revision_opt *opt)
{
	struct userformat_want w;
A
Antoine Pelisse 已提交
99
	int quiet = 0, source = 0, mailmap = 0;
100 101

	const struct option builtin_log_options[] = {
102 103
		OPT_BOOLEAN(0, "quiet", &quiet, N_("suppress diff output")),
		OPT_BOOLEAN(0, "source", &source, N_("show source")),
A
Antoine Pelisse 已提交
104
		OPT_BOOLEAN(0, "use-mailmap", &mailmap, N_("Use mail map file")),
105
		{ OPTION_CALLBACK, 0, "decorate", NULL, NULL, N_("decorate options"),
106 107 108 109
		  PARSE_OPT_OPTARG, decorate_callback},
		OPT_END()
	};

110
	mailmap = use_mailmap_config;
111 112 113 114
	argc = parse_options(argc, argv, prefix,
			     builtin_log_options, builtin_log_usage,
			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
			     PARSE_OPT_KEEP_DASHDASH);
J
Junio C Hamano 已提交
115

116 117
	if (quiet)
		rev->diffopt.output_format |= DIFF_FORMAT_NO_OUTPUT;
J
Jeff King 已提交
118
	argc = setup_revisions(argc, argv, rev, opt);
H
Heikki Orsila 已提交
119

120 121 122 123
	/* Any arguments at this point are not recognized */
	if (argc > 1)
		die("unrecognized argument: %s", argv[1]);

124 125 126 127
	memset(&w, 0, sizeof(w));
	userformat_find_requirements(NULL, &w);

	if (!rev->show_notes_given && (!rev->pretty_given || w.notes))
128
		rev->show_notes = 1;
129 130
	if (rev->show_notes)
		init_display_notes(&rev->notes_opt);
131

132 133
	if (rev->diffopt.pickaxe || rev->diffopt.filter)
		rev->always_show_header = 0;
134
	if (DIFF_OPT_TST(&rev->diffopt, FOLLOW_RENAMES)) {
135
		rev->always_show_header = 0;
136
		if (rev->diffopt.pathspec.nr != 1)
137 138
			usage("git logs can only follow renames on one pathname at a time");
	}
139 140 141

	if (source)
		rev->show_source = 1;
142

A
Antoine Pelisse 已提交
143 144 145 146 147
	if (mailmap) {
		rev->mailmap = xcalloc(1, sizeof(struct string_list));
		read_mailmap(rev->mailmap, NULL);
	}

148 149 150 151 152 153 154 155 156 157
	if (rev->pretty_given && rev->commit_format == CMIT_FMT_RAW) {
		/*
		 * "log --pretty=raw" is special; ignore UI oriented
		 * configuration variables such as decoration.
		 */
		if (!decoration_given)
			decoration_style = 0;
		if (!rev->abbrev_commit_given)
			rev->abbrev_commit = 0;
	}
158

159 160 161 162
	if (decoration_style) {
		rev->show_decorations = 1;
		load_ref_decorations(decoration_style);
	}
163
	setup_pager();
164 165
}

166 167 168 169 170 171 172
static void cmd_log_init(int argc, const char **argv, const char *prefix,
			 struct rev_info *rev, struct setup_revision_opt *opt)
{
	cmd_log_init_defaults(rev);
	cmd_log_init_finish(argc, argv, prefix, rev, opt);
}

L
Linus Torvalds 已提交
173 174 175 176 177 178 179 180 181 182 183 184
/*
 * This gives a rough estimate for how many commits we
 * will print out in the list.
 */
static int estimate_commit_count(struct rev_info *rev, struct commit_list *list)
{
	int n = 0;

	while (list) {
		struct commit *commit = list->item;
		unsigned int flags = commit->object.flags;
		list = list->next;
185
		if (!(flags & (TREESAME | UNINTERESTING)))
L
Linus Torvalds 已提交
186
			n++;
L
Linus Torvalds 已提交
187 188 189 190 191 192 193 194 195 196 197
	}
	return n;
}

static void show_early_header(struct rev_info *rev, const char *stage, int nr)
{
	if (rev->shown_one) {
		rev->shown_one = 0;
		if (rev->commit_format != CMIT_FMT_ONELINE)
			putchar(rev->diffopt.line_termination);
	}
198
	printf(_("Final output: %d %s\n"), nr, stage);
L
Linus Torvalds 已提交
199 200
}

201
static struct itimerval early_output_timer;
L
Linus Torvalds 已提交
202

203 204 205
static void log_show_early(struct rev_info *revs, struct commit_list *list)
{
	int i = revs->early_output;
L
Linus Torvalds 已提交
206
	int show_header = 1;
207 208 209 210

	sort_in_topological_order(&list, revs->lifo);
	while (list && i) {
		struct commit *commit = list->item;
L
Linus Torvalds 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
		switch (simplify_commit(revs, commit)) {
		case commit_show:
			if (show_header) {
				int n = estimate_commit_count(revs, list);
				show_early_header(revs, "incomplete", n);
				show_header = 0;
			}
			log_tree_commit(revs, commit);
			i--;
			break;
		case commit_ignore:
			break;
		case commit_error:
			return;
		}
226 227
		list = list->next;
	}
L
Linus Torvalds 已提交
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245

	/* Did we already get enough commits for the early output? */
	if (!i)
		return;

	/*
	 * ..if no, then repeat it twice a second until we
	 * do.
	 *
	 * NOTE! We don't use "it_interval", because if the
	 * reader isn't listening, we want our output to be
	 * throttled by the writing, and not have the timer
	 * trigger every second even if we're blocked on a
	 * reader!
	 */
	early_output_timer.it_value.tv_sec = 0;
	early_output_timer.it_value.tv_usec = 500000;
	setitimer(ITIMER_REAL, &early_output_timer, NULL);
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
}

static void early_output(int signal)
{
	show_early_output = log_show_early;
}

static void setup_early_output(struct rev_info *rev)
{
	struct sigaction sa;

	/*
	 * Set up the signal handler, minimally intrusively:
	 * we only set a single volatile integer word (not
	 * using sigatomic_t - trying to avoid unnecessary
	 * system dependencies and headers), and using
	 * SA_RESTART.
	 */
	memset(&sa, 0, sizeof(sa));
	sa.sa_handler = early_output;
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = SA_RESTART;
	sigaction(SIGALRM, &sa, NULL);

	/*
	 * If we can get the whole output in less than a
	 * tenth of a second, don't even bother doing the
	 * early-output thing..
	 *
	 * This is a one-time-only trigger.
	 */
L
Linus Torvalds 已提交
277 278 279
	early_output_timer.it_value.tv_sec = 0;
	early_output_timer.it_value.tv_usec = 100000;
	setitimer(ITIMER_REAL, &early_output_timer, NULL);
280 281 282 283
}

static void finish_early_output(struct rev_info *rev)
{
L
Linus Torvalds 已提交
284
	int n = estimate_commit_count(rev, rev->commits);
285
	signal(SIGALRM, SIG_IGN);
L
Linus Torvalds 已提交
286
	show_early_header(rev, "done", n);
287 288
}

289 290 291
static int cmd_log_walk(struct rev_info *rev)
{
	struct commit *commit;
292 293
	int saved_nrl = 0;
	int saved_dcctc = 0;
294

295 296 297
	if (rev->early_output)
		setup_early_output(rev);

298
	if (prepare_revision_walk(rev))
299
		die(_("revision walk setup failed"));
300 301 302 303

	if (rev->early_output)
		finish_early_output(rev);

304
	/*
305 306 307
	 * For --check and --exit-code, the exit code is based on CHECK_FAILED
	 * and HAS_CHANGES being accumulated in rev->diffopt, so be careful to
	 * retain that state information if replacing rev->diffopt in this loop
308
	 */
309
	while ((commit = get_revision(rev)) != NULL) {
310 311 312 313 314 315 316
		if (!log_tree_commit(rev, commit) &&
		    rev->max_count >= 0)
			/*
			 * We decremented max_count in get_revision,
			 * but we didn't actually show the commit.
			 */
			rev->max_count++;
317 318 319 320 321
		if (!rev->reflog_info) {
			/* we allow cycles in reflog ancestry */
			free(commit->buffer);
			commit->buffer = NULL;
		}
L
Linus Torvalds 已提交
322 323
		free_commit_list(commit->parents);
		commit->parents = NULL;
324 325 326 327
		if (saved_nrl < rev->diffopt.needed_rename_limit)
			saved_nrl = rev->diffopt.needed_rename_limit;
		if (rev->diffopt.degraded_cc_to_c)
			saved_dcctc = 1;
328
	}
329 330 331
	rev->diffopt.degraded_cc_to_c = saved_dcctc;
	rev->diffopt.needed_rename_limit = saved_nrl;

332 333 334 335
	if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
	    DIFF_OPT_TST(&rev->diffopt, CHECK_FAILED)) {
		return 02;
	}
336
	return diff_result_code(&rev->diffopt, 0);
337 338
}

339
static int git_log_config(const char *var, const char *value, void *cb)
340
{
341 342
	if (!strcmp(var, "format.pretty"))
		return git_config_string(&fmt_pretty, var, value);
343 344
	if (!strcmp(var, "format.subjectprefix"))
		return git_config_string(&fmt_patch_subject_prefix, var, value);
345 346 347 348
	if (!strcmp(var, "log.abbrevcommit")) {
		default_abbrev_commit = git_config_bool(var, value);
		return 0;
	}
H
Heikki Orsila 已提交
349 350
	if (!strcmp(var, "log.date"))
		return git_config_string(&default_date_mode, var, value);
351
	if (!strcmp(var, "log.decorate")) {
J
Junio C Hamano 已提交
352 353 354
		decoration_style = parse_decoration_style(var, value);
		if (decoration_style < 0)
			decoration_style = 0; /* maybe warn? */
355 356
		return 0;
	}
357 358 359 360
	if (!strcmp(var, "log.showroot")) {
		default_show_root = git_config_bool(var, value);
		return 0;
	}
361 362
	if (!prefixcmp(var, "color.decorate."))
		return parse_decorate_color_config(var, 15, value);
363 364 365 366 367
	if (!strcmp(var, "log.mailmap")) {
		use_mailmap_config = git_config_bool(var, value);
		return 0;
	}

J
Junio C Hamano 已提交
368 369
	if (grep_config(var, value, cb) < 0)
		return -1;
370
	return git_diff_ui_config(var, value, cb);
371 372
}

373
int cmd_whatchanged(int argc, const char **argv, const char *prefix)
374 375
{
	struct rev_info rev;
376
	struct setup_revision_opt opt;
377

J
Junio C Hamano 已提交
378
	init_grep_defaults();
379
	git_config(git_log_config, NULL);
380

381
	init_revisions(&rev, prefix);
382
	rev.diff = 1;
L
Linus Torvalds 已提交
383
	rev.simplify_history = 0;
384 385
	memset(&opt, 0, sizeof(opt));
	opt.def = "HEAD";
386
	opt.revarg_opt = REVARG_COMMITTISH;
387
	cmd_log_init(argc, argv, prefix, &rev, &opt);
388 389 390
	if (!rev.diffopt.output_format)
		rev.diffopt.output_format = DIFF_FORMAT_RAW;
	return cmd_log_walk(&rev);
391 392
}

393 394
static void show_tagger(char *buf, int len, struct rev_info *rev)
{
395
	struct strbuf out = STRBUF_INIT;
396
	struct pretty_print_context pp = {0};
397

398 399 400
	pp.fmt = rev->commit_format;
	pp.date_mode = rev->date_mode;
	pp_user_info(&pp, "Tagger", &out, buf, get_log_output_encoding());
401
	printf("%s", out.buf);
402
	strbuf_release(&out);
403 404
}

405 406 407 408 409 410 411
static int show_blob_object(const unsigned char *sha1, struct rev_info *rev)
{
	fflush(stdout);
	return stream_blob_to_fd(1, sha1, NULL, 0);
}

static int show_tag_object(const unsigned char *sha1, struct rev_info *rev)
412 413
{
	unsigned long size;
414 415
	enum object_type type;
	char *buf = read_sha1_file(sha1, &type, &size);
416 417 418
	int offset = 0;

	if (!buf)
419
		return error(_("Could not read object %s"), sha1_to_hex(sha1));
420

421 422 423 424 425 426 427 428 429 430
	assert(type == OBJ_TAG);
	while (offset < size && buf[offset] != '\n') {
		int new_offset = offset + 1;
		while (new_offset < size && buf[new_offset++] != '\n')
			; /* do nothing */
		if (!prefixcmp(buf + offset, "tagger "))
			show_tagger(buf + offset + 7,
				    new_offset - offset - 7, rev);
		offset = new_offset;
	}
431 432 433 434 435 436 437 438 439

	if (offset < size)
		fwrite(buf + offset, size - offset, 1, stdout);
	free(buf);
	return 0;
}

static int show_tree_object(const unsigned char *sha1,
		const char *base, int baselen,
440
		const char *pathname, unsigned mode, int stage, void *context)
441 442 443 444 445
{
	printf("%s%s\n", pathname, S_ISDIR(mode) ? "/" : "");
	return 0;
}

J
Junio C Hamano 已提交
446 447
static void show_rev_tweak_rev(struct rev_info *rev, struct setup_revision_opt *opt)
{
448 449 450 451 452 453 454 455 456
	if (rev->ignore_merges) {
		/* There was no "-m" on the command line */
		rev->ignore_merges = 0;
		if (!rev->first_parent_only && !rev->combine_merges) {
			/* No "--first-parent", "-c", nor "--cc" */
			rev->combine_merges = 1;
			rev->dense_combined_merges = 1;
		}
	}
J
Junio C Hamano 已提交
457 458 459 460
	if (!rev->diffopt.output_format)
		rev->diffopt.output_format = DIFF_FORMAT_PATCH;
}

461
int cmd_show(int argc, const char **argv, const char *prefix)
462 463
{
	struct rev_info rev;
464
	struct object_array_entry *objects;
465
	struct setup_revision_opt opt;
466
	struct pathspec match_all;
467
	int i, count, ret = 0;
468

J
Junio C Hamano 已提交
469
	init_grep_defaults();
470
	git_config(git_log_config, NULL);
471

472
	init_pathspec(&match_all, NULL);
473
	init_revisions(&rev, prefix);
474 475
	rev.diff = 1;
	rev.always_show_header = 1;
476
	rev.no_walk = REVISION_WALK_NO_WALK_SORTED;
477 478
	rev.diffopt.stat_width = -1; 	/* Scale to real terminal size */

479 480
	memset(&opt, 0, sizeof(opt));
	opt.def = "HEAD";
J
Junio C Hamano 已提交
481
	opt.tweak = show_rev_tweak_rev;
482
	cmd_log_init(argc, argv, prefix, &rev, &opt);
483

484 485 486
	if (!rev.no_walk)
		return cmd_log_walk(&rev);

487 488 489 490 491 492 493
	count = rev.pending.nr;
	objects = rev.pending.objects;
	for (i = 0; i < count && !ret; i++) {
		struct object *o = objects[i].item;
		const char *name = objects[i].name;
		switch (o->type) {
		case OBJ_BLOB:
494
			ret = show_blob_object(o->sha1, NULL);
495 496 497 498
			break;
		case OBJ_TAG: {
			struct tag *t = (struct tag *)o;

499 500
			if (rev.shown_one)
				putchar('\n');
501
			printf("%stag %s%s\n",
502
					diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
503
					t->tag,
504
					diff_get_color_opt(&rev.diffopt, DIFF_RESET));
505
			ret = show_tag_object(o->sha1, &rev);
506
			rev.shown_one = 1;
507 508 509 510
			if (ret)
				break;
			o = parse_object(t->tagged->sha1);
			if (!o)
511
				ret = error(_("Could not read object %s"),
512 513
					    sha1_to_hex(t->tagged->sha1));
			objects[i].item = o;
514 515 516 517
			i--;
			break;
		}
		case OBJ_TREE:
518 519
			if (rev.shown_one)
				putchar('\n');
520
			printf("%stree %s%s\n\n",
521
					diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
522
					name,
523
					diff_get_color_opt(&rev.diffopt, DIFF_RESET));
524
			read_tree_recursive((struct tree *)o, "", 0, 0, &match_all,
525
					show_tree_object, NULL);
526
			rev.shown_one = 1;
527 528 529 530 531 532 533 534
			break;
		case OBJ_COMMIT:
			rev.pending.nr = rev.pending.alloc = 0;
			rev.pending.objects = NULL;
			add_object_array(o, name, &rev.pending);
			ret = cmd_log_walk(&rev);
			break;
		default:
535
			ret = error(_("Unknown type: %d"), o->type);
536 537 538 539
		}
	}
	free(objects);
	return ret;
540 541
}

L
Linus Torvalds 已提交
542 543 544 545 546 547
/*
 * This is equivalent to "git log -g --abbrev-commit --pretty=oneline"
 */
int cmd_log_reflog(int argc, const char **argv, const char *prefix)
{
	struct rev_info rev;
548
	struct setup_revision_opt opt;
L
Linus Torvalds 已提交
549

J
Junio C Hamano 已提交
550
	init_grep_defaults();
551
	git_config(git_log_config, NULL);
552

L
Linus Torvalds 已提交
553 554 555
	init_revisions(&rev, prefix);
	init_reflog_walk(&rev.reflog_info);
	rev.verbose_header = 1;
556 557
	memset(&opt, 0, sizeof(opt));
	opt.def = "HEAD";
558
	cmd_log_init_defaults(&rev);
559
	rev.abbrev_commit = 1;
L
Linus Torvalds 已提交
560
	rev.commit_format = CMIT_FMT_ONELINE;
561
	rev.use_terminator = 1;
L
Linus Torvalds 已提交
562
	rev.always_show_header = 1;
563
	cmd_log_init_finish(argc, argv, prefix, &rev, &opt);
L
Linus Torvalds 已提交
564 565 566 567

	return cmd_log_walk(&rev);
}

568
int cmd_log(int argc, const char **argv, const char *prefix)
569 570
{
	struct rev_info rev;
571
	struct setup_revision_opt opt;
572

J
Junio C Hamano 已提交
573
	init_grep_defaults();
574
	git_config(git_log_config, NULL);
575

576
	init_revisions(&rev, prefix);
577
	rev.always_show_header = 1;
578 579
	memset(&opt, 0, sizeof(opt));
	opt.def = "HEAD";
580
	opt.revarg_opt = REVARG_COMMITTISH;
581
	cmd_log_init(argc, argv, prefix, &rev, &opt);
582
	return cmd_log_walk(&rev);
583
}
584

585
/* format-patch */
586

587
static const char *fmt_patch_suffix = ".patch";
588
static int numbered = 0;
589
static int auto_number = 1;
590

591 592
static char *default_attach = NULL;

593 594 595
static struct string_list extra_hdr;
static struct string_list extra_to;
static struct string_list extra_cc;
D
Daniel Barkalow 已提交
596 597 598

static void add_header(const char *value)
{
599
	struct string_list_item *item;
D
Daniel Barkalow 已提交
600
	int len = strlen(value);
601
	while (len && value[len - 1] == '\n')
D
Daniel Barkalow 已提交
602
		len--;
603

D
Daniel Barkalow 已提交
604
	if (!strncasecmp(value, "to: ", 4)) {
605
		item = string_list_append(&extra_to, value + 4);
606 607
		len -= 4;
	} else if (!strncasecmp(value, "cc: ", 4)) {
608
		item = string_list_append(&extra_cc, value + 4);
609 610
		len -= 4;
	} else {
611
		item = string_list_append(&extra_hdr, value);
D
Daniel Barkalow 已提交
612
	}
613 614

	item->string[len] = '\0';
D
Daniel Barkalow 已提交
615 616
}

617 618
#define THREAD_SHALLOW 1
#define THREAD_DEEP 2
619 620 621
static int thread;
static int do_signoff;
static const char *signature = git_version_string;
622

623
static int git_format_config(const char *var, const char *value, void *cb)
624 625
{
	if (!strcmp(var, "format.headers")) {
626
		if (!value)
627
			die(_("format.headers without value"));
D
Daniel Barkalow 已提交
628
		add_header(value);
629 630
		return 0;
	}
631 632
	if (!strcmp(var, "format.suffix"))
		return git_config_string(&fmt_patch_suffix, var, value);
633 634 635
	if (!strcmp(var, "format.to")) {
		if (!value)
			return config_error_nonbool(var);
636
		string_list_append(&extra_to, value);
637 638
		return 0;
	}
639 640 641
	if (!strcmp(var, "format.cc")) {
		if (!value)
			return config_error_nonbool(var);
642
		string_list_append(&extra_cc, value);
643 644
		return 0;
	}
P
Pang Yan Han 已提交
645 646
	if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff") ||
	    !strcmp(var, "color.ui")) {
647 648
		return 0;
	}
649
	if (!strcmp(var, "format.numbered")) {
650
		if (value && !strcasecmp(value, "auto")) {
651 652 653 654
			auto_number = 1;
			return 0;
		}
		numbered = git_config_bool(var, value);
655
		auto_number = auto_number && numbered;
656 657
		return 0;
	}
658 659 660 661 662 663 664
	if (!strcmp(var, "format.attach")) {
		if (value && *value)
			default_attach = xstrdup(value);
		else
			default_attach = xstrdup(git_version_string);
		return 0;
	}
665 666 667 668 669 670 671 672 673 674 675 676
	if (!strcmp(var, "format.thread")) {
		if (value && !strcasecmp(value, "deep")) {
			thread = THREAD_DEEP;
			return 0;
		}
		if (value && !strcasecmp(value, "shallow")) {
			thread = THREAD_SHALLOW;
			return 0;
		}
		thread = git_config_bool(var, value) && THREAD_SHALLOW;
		return 0;
	}
677 678 679 680
	if (!strcmp(var, "format.signoff")) {
		do_signoff = git_config_bool(var, value);
		return 0;
	}
681 682
	if (!strcmp(var, "format.signature"))
		return git_config_string(&signature, var, value);
683

684
	return git_log_config(var, value, cb);
685 686
}

687
static FILE *realstdout = NULL;
688
static const char *output_directory = NULL;
689
static int outdir_offset;
690

691 692
static int reopen_stdout(struct commit *commit, const char *subject,
			 struct rev_info *rev, int quiet)
693
{
694
	struct strbuf filename = STRBUF_INIT;
695
	int suffix_len = strlen(rev->patch_suffix) + 1;
696

697
	if (output_directory) {
698 699 700
		strbuf_addstr(&filename, output_directory);
		if (filename.len >=
		    PATH_MAX - FORMAT_PATCH_NAME_MAX - suffix_len)
701
			return error(_("name of output directory is too long"));
702 703
		if (filename.buf[filename.len - 1] != '/')
			strbuf_addch(&filename, '/');
704
	}
705

706 707
	if (rev->numbered_files)
		strbuf_addf(&filename, "%d", rev->nr);
708 709
	else if (commit)
		fmt_output_commit(&filename, commit, rev);
710
	else
711
		fmt_output_subject(&filename, subject, rev);
712

713
	if (!quiet)
714
		fprintf(realstdout, "%s\n", filename.buf + outdir_offset);
N
Nate Case 已提交
715

716
	if (freopen(filename.buf, "w", stdout) == NULL)
717
		return error(_("Cannot open patch file %s"), filename.buf);
718

719
	strbuf_release(&filename);
720
	return 0;
721 722
}

723
static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)
724 725 726 727 728 729 730
{
	struct rev_info check_rev;
	struct commit *commit;
	struct object *o1, *o2;
	unsigned flags1, flags2;

	if (rev->pending.nr != 2)
731
		die(_("Need exactly one range."));
732 733 734 735 736 737 738

	o1 = rev->pending.objects[0].item;
	flags1 = o1->flags;
	o2 = rev->pending.objects[1].item;
	flags2 = o2->flags;

	if ((flags1 & UNINTERESTING) == (flags2 & UNINTERESTING))
739
		die(_("Not a range."));
740

741
	init_patch_ids(ids);
742 743

	/* given a range a..b get all patch ids for b..a */
744
	init_revisions(&check_rev, rev->prefix);
745
	check_rev.max_parents = 1;
746 747 748 749
	o1->flags ^= UNINTERESTING;
	o2->flags ^= UNINTERESTING;
	add_pending_object(&check_rev, o1, "o1");
	add_pending_object(&check_rev, o2, "o2");
750
	if (prepare_revision_walk(&check_rev))
751
		die(_("revision walk setup failed"));
752 753

	while ((commit = get_revision(&check_rev)) != NULL) {
754
		add_commit_patch_id(commit, ids);
755 756 757
	}

	/* reset for next revision walk */
758 759 760 761
	clear_commit_marks((struct commit *)o1,
			SEEN | UNINTERESTING | SHOWN | ADDED);
	clear_commit_marks((struct commit *)o2,
			SEEN | UNINTERESTING | SHOWN | ADDED);
762 763 764 765
	o1->flags = flags1;
	o2->flags = flags2;
}

766
static void gen_message_id(struct rev_info *info, char *base)
767
{
768
	struct strbuf buf = STRBUF_INIT;
769
	strbuf_addf(&buf, "%s.%lu.git.%s", base,
770
		    (unsigned long) time(NULL),
771
		    git_committer_info(IDENT_NO_NAME|IDENT_NO_DATE|IDENT_STRICT));
772
	info->message_id = strbuf_detach(&buf, NULL);
773 774
}

775 776 777 778 779 780
static void print_signature(void)
{
	if (signature && *signature)
		printf("-- \n%s\n\n", signature);
}

781 782 783 784 785 786 787 788 789 790 791 792 793
static void add_branch_description(struct strbuf *buf, const char *branch_name)
{
	struct strbuf desc = STRBUF_INIT;
	if (!branch_name || !*branch_name)
		return;
	read_branch_desc(&desc, branch_name);
	if (desc.len) {
		strbuf_addch(buf, '\n');
		strbuf_add(buf, desc.buf, desc.len);
		strbuf_addch(buf, '\n');
	}
}

794 795
static void make_cover_letter(struct rev_info *rev, int use_stdout,
			      struct commit *origin,
796
			      int nr, struct commit **list, struct commit *head,
797
			      const char *branch_name,
798
			      int quiet)
799 800 801 802
{
	const char *committer;
	const char *body = "*** SUBJECT HERE ***\n\n*** BLURB HERE ***\n";
	const char *msg;
803
	struct shortlog log;
804
	struct strbuf sb = STRBUF_INIT;
805
	int i;
806
	const char *encoding = "UTF-8";
807
	struct diff_options opts;
J
Junio C Hamano 已提交
808
	int need_8bit_cte = 0;
809
	struct pretty_print_context pp = {0};
810 811

	if (rev->commit_format != CMIT_FMT_EMAIL)
812
		die(_("Cover letter needs email format"));
813

814
	committer = git_committer_info(0);
815

816
	if (!use_stdout &&
817
	    reopen_stdout(NULL, rev->numbered_files ? NULL : "cover-letter", rev, quiet))
818 819
		return;

820
	log_write_email_headers(rev, head, &pp.subject, &pp.after_subject,
J
Junio C Hamano 已提交
821
				&need_8bit_cte);
822

823 824 825 826
	for (i = 0; !need_8bit_cte && i < nr; i++)
		if (has_non_ascii(list[i]->buffer))
			need_8bit_cte = 1;

827
	msg = body;
828 829 830 831 832
	pp.fmt = CMIT_FMT_EMAIL;
	pp.date_mode = DATE_RFC2822;
	pp_user_info(&pp, NULL, &sb, committer, encoding);
	pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte);
	pp_remainder(&pp, &msg, &sb, 0);
833
	add_branch_description(&sb, branch_name);
834 835 836 837
	printf("%s\n", sb.buf);

	strbuf_release(&sb);

838
	shortlog_init(&log);
839 840 841 842
	log.wrap_lines = 1;
	log.wrap = 72;
	log.in1 = 2;
	log.in2 = 4;
843 844 845 846 847
	for (i = 0; i < nr; i++)
		shortlog_add_commit(&log, list[i]);

	shortlog_output(&log);

848
	/*
849
	 * We can only do diffstat with a unique reference point
850 851 852 853
	 */
	if (!origin)
		return;

854 855
	memcpy(&opts, &rev->diffopt, sizeof(opts));
	opts.output_format = DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
856

857 858 859 860 861 862 863
	diff_setup_done(&opts);

	diff_tree_sha1(origin->tree->object.sha1,
		       head->tree->object.sha1,
		       "", &opts);
	diffcore_std(&opts);
	diff_flush(&opts);
864 865

	printf("\n");
866
	print_signature();
867 868
}

869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884
static const char *clean_message_id(const char *msg_id)
{
	char ch;
	const char *a, *z, *m;

	m = msg_id;
	while ((ch = *m) && (isspace(ch) || (ch == '<')))
		m++;
	a = m;
	z = NULL;
	while ((ch = *m)) {
		if (!isspace(ch) && (ch != '>'))
			z = m;
		m++;
	}
	if (!z)
885
		die(_("insane in-reply-to: %s"), msg_id);
886 887
	if (++z == m)
		return a;
P
Pierre Habouzit 已提交
888
	return xmemdupz(a, z - a);
889 890
}

891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911
static const char *set_outdir(const char *prefix, const char *output_directory)
{
	if (output_directory && is_absolute_path(output_directory))
		return output_directory;

	if (!prefix || !*prefix) {
		if (output_directory)
			return output_directory;
		/* The user did not explicitly ask for "./" */
		outdir_offset = 2;
		return "./";
	}

	outdir_offset = strlen(prefix);
	if (!output_directory)
		return prefix;

	return xstrdup(prefix_filename(prefix, outdir_offset,
				       output_directory));
}

912
static const char * const builtin_format_patch_usage[] = {
913
	N_("git format-patch [options] [<since> | <revision range>]"),
914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935
	NULL
};

static int keep_subject = 0;

static int keep_callback(const struct option *opt, const char *arg, int unset)
{
	((struct rev_info *)opt->value)->total = -1;
	keep_subject = 1;
	return 0;
}

static int subject_prefix = 0;

static int subject_prefix_callback(const struct option *opt, const char *arg,
			    int unset)
{
	subject_prefix = 1;
	((struct rev_info *)opt->value)->subject_prefix = arg;
	return 0;
}

936 937
static int numbered_cmdline_opt = 0;

938 939 940
static int numbered_callback(const struct option *opt, const char *arg,
			     int unset)
{
941
	*(int *)opt->value = numbered_cmdline_opt = unset ? 0 : 1;
942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957
	if (unset)
		auto_number =  0;
	return 0;
}

static int no_numbered_callback(const struct option *opt, const char *arg,
				int unset)
{
	return numbered_callback(opt, arg, 1);
}

static int output_directory_callback(const struct option *opt, const char *arg,
			      int unset)
{
	const char **dir = (const char **)opt->value;
	if (*dir)
958
		die(_("Two output directories?"));
959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004
	*dir = arg;
	return 0;
}

static int thread_callback(const struct option *opt, const char *arg, int unset)
{
	int *thread = (int *)opt->value;
	if (unset)
		*thread = 0;
	else if (!arg || !strcmp(arg, "shallow"))
		*thread = THREAD_SHALLOW;
	else if (!strcmp(arg, "deep"))
		*thread = THREAD_DEEP;
	else
		return 1;
	return 0;
}

static int attach_callback(const struct option *opt, const char *arg, int unset)
{
	struct rev_info *rev = (struct rev_info *)opt->value;
	if (unset)
		rev->mime_boundary = NULL;
	else if (arg)
		rev->mime_boundary = arg;
	else
		rev->mime_boundary = git_version_string;
	rev->no_inline = unset ? 0 : 1;
	return 0;
}

static int inline_callback(const struct option *opt, const char *arg, int unset)
{
	struct rev_info *rev = (struct rev_info *)opt->value;
	if (unset)
		rev->mime_boundary = NULL;
	else if (arg)
		rev->mime_boundary = arg;
	else
		rev->mime_boundary = git_version_string;
	rev->no_inline = 0;
	return 0;
}

static int header_callback(const struct option *opt, const char *arg, int unset)
{
1005 1006 1007 1008 1009 1010 1011
	if (unset) {
		string_list_clear(&extra_hdr, 0);
		string_list_clear(&extra_to, 0);
		string_list_clear(&extra_cc, 0);
	} else {
	    add_header(arg);
	}
1012 1013 1014
	return 0;
}

1015 1016
static int to_callback(const struct option *opt, const char *arg, int unset)
{
1017 1018 1019
	if (unset)
		string_list_clear(&extra_to, 0);
	else
1020
		string_list_append(&extra_to, arg);
1021 1022 1023 1024 1025
	return 0;
}

static int cc_callback(const struct option *opt, const char *arg, int unset)
{
1026 1027 1028
	if (unset)
		string_list_clear(&extra_cc, 0);
	else
1029
		string_list_append(&extra_cc, arg);
1030 1031 1032
	return 0;
}

1033 1034 1035 1036
static char *find_branch_name(struct rev_info *rev)
{
	int i, positive = -1;
	unsigned char branch_sha1[20];
1037
	const unsigned char *tip_sha1;
1038 1039
	const char *ref;
	char *full_ref, *branch = NULL;
1040 1041 1042 1043 1044 1045 1046 1047 1048

	for (i = 0; i < rev->cmdline.nr; i++) {
		if (rev->cmdline.rev[i].flags & UNINTERESTING)
			continue;
		if (positive < 0)
			positive = i;
		else
			return NULL;
	}
1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
	if (0 <= positive) {
		ref = rev->cmdline.rev[positive].name;
		tip_sha1 = rev->cmdline.rev[positive].item->sha1;
	} else if (!rev->cmdline.nr && rev->pending.nr == 1 &&
		   !strcmp(rev->pending.objects[0].name, "HEAD")) {
		/*
		 * No actual ref from command line, but "HEAD" from
		 * rev->def was added in setup_revisions()
		 * e.g. format-patch --cover-letter -12
		 */
		ref = "HEAD";
		tip_sha1 = rev->pending.objects[0].item->sha1;
	} else {
1062
		return NULL;
1063
	}
1064 1065
	if (dwim_ref(ref, strlen(ref), branch_sha1, &full_ref) &&
	    !prefixcmp(full_ref, "refs/heads/") &&
1066
	    !hashcmp(tip_sha1, branch_sha1))
1067 1068 1069
		branch = xstrdup(full_ref + strlen("refs/heads/"));
	free(full_ref);
	return branch;
1070 1071
}

1072
int cmd_format_patch(int argc, const char **argv, const char *prefix)
1073 1074 1075 1076
{
	struct commit *commit;
	struct commit **list = NULL;
	struct rev_info rev;
1077
	struct setup_revision_opt s_r_opt;
1078
	int nr = 0, total, i;
1079
	int use_stdout = 0;
1080
	int start_number = -1;
1081
	int just_numbers = 0;
1082
	int ignore_if_in_upstream = 0;
1083
	int cover_letter = 0;
1084
	int boundary_count = 0;
1085
	int no_binary_diff = 0;
1086
	struct commit *origin = NULL, *head = NULL;
1087
	const char *in_reply_to = NULL;
1088
	struct patch_ids ids;
J
Junio C Hamano 已提交
1089
	char *add_signoff = NULL;
1090
	struct strbuf buf = STRBUF_INIT;
1091
	int use_patch_format = 0;
1092
	int quiet = 0;
1093
	int reroll_count = -1;
1094
	char *branch_name = NULL;
1095 1096
	const struct option builtin_format_patch_options[] = {
		{ OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
1097
			    N_("use [PATCH n/m] even with a single patch"),
1098 1099
			    PARSE_OPT_NOARG, numbered_callback },
		{ OPTION_CALLBACK, 'N', "no-numbered", &numbered, NULL,
1100
			    N_("use [PATCH] even with multiple patches"),
1101
			    PARSE_OPT_NOARG, no_numbered_callback },
1102
		OPT_BOOLEAN('s', "signoff", &do_signoff, N_("add Signed-off-by:")),
1103
		OPT_BOOLEAN(0, "stdout", &use_stdout,
1104
			    N_("print patches to standard out")),
1105
		OPT_BOOLEAN(0, "cover-letter", &cover_letter,
1106
			    N_("generate a cover letter")),
1107
		OPT_BOOLEAN(0, "numbered-files", &just_numbers,
1108 1109 1110
			    N_("use simple number sequence for output file names")),
		OPT_STRING(0, "suffix", &fmt_patch_suffix, N_("sfx"),
			    N_("use <sfx> instead of '.patch'")),
1111
		OPT_INTEGER(0, "start-number", &start_number,
1112
			    N_("start numbering patches at <n> instead of 1")),
1113
		OPT_INTEGER('v', "reroll-count", &reroll_count,
1114
			    N_("mark the series as Nth re-roll")),
1115 1116
		{ OPTION_CALLBACK, 0, "subject-prefix", &rev, N_("prefix"),
			    N_("Use [<prefix>] instead of [PATCH]"),
1117 1118
			    PARSE_OPT_NONEG, subject_prefix_callback },
		{ OPTION_CALLBACK, 'o', "output-directory", &output_directory,
1119
			    N_("dir"), N_("store resulting files in <dir>"),
1120 1121
			    PARSE_OPT_NONEG, output_directory_callback },
		{ OPTION_CALLBACK, 'k', "keep-subject", &rev, NULL,
1122
			    N_("don't strip/add [PATCH]"),
1123 1124
			    PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback },
		OPT_BOOLEAN(0, "no-binary", &no_binary_diff,
1125
			    N_("don't output binary diffs")),
1126
		OPT_BOOLEAN(0, "ignore-if-in-upstream", &ignore_if_in_upstream,
1127
			    N_("don't include a patch matching a commit upstream")),
1128
		{ OPTION_BOOLEAN, 'p', "no-stat", &use_patch_format, NULL,
1129
		  N_("show patch format instead of default (patch + stat)"),
1130
		  PARSE_OPT_NONEG | PARSE_OPT_NOARG },
1131 1132 1133 1134
		OPT_GROUP(N_("Messaging")),
		{ OPTION_CALLBACK, 0, "add-header", NULL, N_("header"),
			    N_("add email header"), 0, header_callback },
		{ OPTION_CALLBACK, 0, "to", NULL, N_("email"), N_("add To: header"),
1135
			    0, to_callback },
1136
		{ OPTION_CALLBACK, 0, "cc", NULL, N_("email"), N_("add Cc: header"),
1137
			    0, cc_callback },
1138 1139 1140 1141
		OPT_STRING(0, "in-reply-to", &in_reply_to, N_("message-id"),
			    N_("make first mail a reply to <message-id>")),
		{ OPTION_CALLBACK, 0, "attach", &rev, N_("boundary"),
			    N_("attach the patch"), PARSE_OPT_OPTARG,
1142
			    attach_callback },
1143 1144
		{ OPTION_CALLBACK, 0, "inline", &rev, N_("boundary"),
			    N_("inline the patch"),
1145 1146
			    PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
			    inline_callback },
1147 1148
		{ OPTION_CALLBACK, 0, "thread", &thread, N_("style"),
			    N_("enable message threading, styles: shallow, deep"),
1149
			    PARSE_OPT_OPTARG, thread_callback },
1150 1151
		OPT_STRING(0, "signature", &signature, N_("signature"),
			    N_("add a signature")),
1152
		OPT_BOOLEAN(0, "quiet", &quiet,
1153
			    N_("don't print the patch filenames")),
1154 1155
		OPT_END()
	};
1156

1157 1158 1159
	extra_hdr.strdup_strings = 1;
	extra_to.strdup_strings = 1;
	extra_cc.strdup_strings = 1;
J
Junio C Hamano 已提交
1160
	init_grep_defaults();
1161
	git_config(git_format_config, NULL);
1162
	init_revisions(&rev, prefix);
1163 1164 1165
	rev.commit_format = CMIT_FMT_EMAIL;
	rev.verbose_header = 1;
	rev.diff = 1;
1166
	rev.max_parents = 1;
1167
	DIFF_OPT_SET(&rev.diffopt, RECURSIVE);
1168
	rev.subject_prefix = fmt_patch_subject_prefix;
1169 1170
	memset(&s_r_opt, 0, sizeof(s_r_opt));
	s_r_opt.def = "HEAD";
1171
	s_r_opt.revarg_opt = REVARG_COMMITTISH;
1172

1173 1174 1175 1176 1177
	if (default_attach) {
		rev.mime_boundary = default_attach;
		rev.no_inline = 1;
	}

1178 1179
	/*
	 * Parse the arguments before setup_revisions(), or something
1180
	 * like "git format-patch -o a123 HEAD^.." may fail; a123 is
1181 1182
	 * possibly a valid SHA1.
	 */
1183
	argc = parse_options(argc, argv, prefix, builtin_format_patch_options,
1184
			     builtin_format_patch_usage,
1185 1186
			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
			     PARSE_OPT_KEEP_DASHDASH);
1187

1188 1189 1190 1191 1192 1193 1194 1195
	if (0 < reroll_count) {
		struct strbuf sprefix = STRBUF_INIT;
		strbuf_addf(&sprefix, "%s v%d",
			    rev.subject_prefix, reroll_count);
		rev.reroll_count = reroll_count;
		rev.subject_prefix = strbuf_detach(&sprefix, NULL);
	}

1196 1197 1198
	if (do_signoff) {
		const char *committer;
		const char *endpos;
1199
		committer = git_committer_info(IDENT_STRICT);
1200 1201
		endpos = strchr(committer, '>');
		if (!endpos)
1202
			die(_("bogus committer info %s"), committer);
1203 1204 1205
		add_signoff = xmemdupz(committer, endpos - committer + 1);
	}

1206 1207
	for (i = 0; i < extra_hdr.nr; i++) {
		strbuf_addstr(&buf, extra_hdr.items[i].string);
D
Daniel Barkalow 已提交
1208 1209 1210
		strbuf_addch(&buf, '\n');
	}

1211
	if (extra_to.nr)
D
Daniel Barkalow 已提交
1212
		strbuf_addstr(&buf, "To: ");
1213
	for (i = 0; i < extra_to.nr; i++) {
D
Daniel Barkalow 已提交
1214 1215
		if (i)
			strbuf_addstr(&buf, "    ");
1216 1217
		strbuf_addstr(&buf, extra_to.items[i].string);
		if (i + 1 < extra_to.nr)
D
Daniel Barkalow 已提交
1218 1219 1220 1221
			strbuf_addch(&buf, ',');
		strbuf_addch(&buf, '\n');
	}

1222
	if (extra_cc.nr)
D
Daniel Barkalow 已提交
1223
		strbuf_addstr(&buf, "Cc: ");
1224
	for (i = 0; i < extra_cc.nr; i++) {
D
Daniel Barkalow 已提交
1225 1226
		if (i)
			strbuf_addstr(&buf, "    ");
1227 1228
		strbuf_addstr(&buf, extra_cc.items[i].string);
		if (i + 1 < extra_cc.nr)
D
Daniel Barkalow 已提交
1229 1230 1231 1232
			strbuf_addch(&buf, ',');
		strbuf_addch(&buf, '\n');
	}

1233
	rev.extra_headers = strbuf_detach(&buf, NULL);
D
Daniel Barkalow 已提交
1234

1235
	if (start_number < 0)
1236
		start_number = 1;
1237 1238 1239 1240 1241 1242 1243 1244 1245

	/*
	 * If numbered is set solely due to format.numbered in config,
	 * and it would conflict with --keep-subject (-k) from the
	 * command line, reset "numbered".
	 */
	if (numbered && keep_subject && !numbered_cmdline_opt)
		numbered = 0;

1246
	if (numbered && keep_subject)
1247
		die (_("-n and -k are mutually exclusive."));
1248
	if (keep_subject && subject_prefix)
1249
		die (_("--subject-prefix and -k are mutually exclusive."));
1250
	rev.preserve_subject = keep_subject;
1251

1252
	argc = setup_revisions(argc, argv, &rev, &s_r_opt);
1253
	if (argc > 1)
1254
		die (_("unrecognized argument: %s"), argv[1]);
1255

1256
	if (rev.diffopt.output_format & DIFF_FORMAT_NAME)
1257
		die(_("--name-only does not make sense"));
1258
	if (rev.diffopt.output_format & DIFF_FORMAT_NAME_STATUS)
1259
		die(_("--name-status does not make sense"));
1260
	if (rev.diffopt.output_format & DIFF_FORMAT_CHECKDIFF)
1261
		die(_("--check does not make sense"));
1262 1263 1264 1265 1266 1267 1268 1269

	if (!use_patch_format &&
		(!rev.diffopt.output_format ||
		 rev.diffopt.output_format == DIFF_FORMAT_PATCH))
		rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY;

	/* Always generate a patch */
	rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
1270

1271
	if (!DIFF_OPT_TST(&rev.diffopt, TEXT) && !no_binary_diff)
1272
		DIFF_OPT_SET(&rev.diffopt, BINARY);
1273

1274 1275 1276
	if (rev.show_notes)
		init_display_notes(&rev.notes_opt);

1277 1278
	if (!use_stdout)
		output_directory = set_outdir(prefix, output_directory);
1279 1280
	else
		setup_pager();
1281

1282 1283
	if (output_directory) {
		if (use_stdout)
1284
			die(_("standard output, or directory, which one?"));
1285
		if (mkdir(output_directory, 0777) < 0 && errno != EEXIST)
1286
			die_errno(_("Could not create directory '%s'"),
1287
				  output_directory);
1288 1289
	}

1290
	if (rev.pending.nr == 1) {
1291 1292 1293 1294 1295 1296
		if (rev.max_count < 0 && !rev.show_root_diff) {
			/*
			 * This is traditional behaviour of "git format-patch
			 * origin" that prepares what the origin side still
			 * does not have.
			 */
1297 1298 1299
			unsigned char sha1[20];
			const char *ref;

J
Junio C Hamano 已提交
1300
			rev.pending.objects[0].item->flags |= UNINTERESTING;
1301
			add_head_to_pending(&rev);
1302
			ref = resolve_ref_unsafe("HEAD", sha1, 1, NULL);
1303 1304 1305 1306
			if (ref && !prefixcmp(ref, "refs/heads/"))
				branch_name = xstrdup(ref + strlen("refs/heads/"));
			else
				branch_name = xstrdup(""); /* no branch */
J
Junio C Hamano 已提交
1307
		}
1308 1309 1310 1311
		/*
		 * Otherwise, it is "format-patch -22 HEAD", and/or
		 * "format-patch --root HEAD".  The user wants
		 * get_revision() to do the usual traversal.
J
Junio C Hamano 已提交
1312
		 */
1313
	}
1314 1315 1316

	/*
	 * We cannot move this anywhere earlier because we do want to
1317
	 * know if --root was given explicitly from the command line.
1318 1319 1320
	 */
	rev.show_root_diff = 1;

1321
	if (cover_letter) {
1322 1323 1324 1325 1326 1327 1328 1329 1330
		/*
		 * NEEDSWORK:randomly pick one positive commit to show
		 * diffstat; this is often the tip and the command
		 * happens to do the right thing in most cases, but a
		 * complex command like "--cover-letter a b c ^bottom"
		 * picks "c" and shows diffstat between bottom..c
		 * which may not match what the series represents at
		 * all and totally broken.
		 */
1331 1332 1333
		int i;
		for (i = 0; i < rev.pending.nr; i++) {
			struct object *o = rev.pending.objects[i].item;
1334
			if (!(o->flags & UNINTERESTING))
1335 1336
				head = (struct commit *)o;
		}
1337
		/* There is nothing to show; it is not an error, though. */
1338 1339
		if (!head)
			return 0;
1340 1341
		if (!branch_name)
			branch_name = find_branch_name(&rev);
1342
	}
1343

1344 1345 1346 1347 1348 1349 1350
	if (ignore_if_in_upstream) {
		/* Don't say anything if head and upstream are the same. */
		if (rev.pending.nr == 2) {
			struct object_array_entry *o = rev.pending.objects;
			if (hashcmp(o[0].item->sha1, o[1].item->sha1) == 0)
				return 0;
		}
1351
		get_patch_ids(&rev, &ids);
1352
	}
1353

1354
	if (!use_stdout)
1355
		realstdout = xfdopen(xdup(1), "w");
1356

1357
	if (prepare_revision_walk(&rev))
1358
		die(_("revision walk setup failed"));
1359
	rev.boundary = 1;
1360
	while ((commit = get_revision(&rev)) != NULL) {
1361 1362 1363 1364 1365 1366
		if (commit->object.flags & BOUNDARY) {
			boundary_count++;
			origin = (boundary_count == 1) ? commit : NULL;
			continue;
		}

1367
		if (ignore_if_in_upstream &&
1368
				has_commit_patch_id(commit, &ids))
1369 1370
			continue;

1371
		nr++;
J
Jonas Fonseca 已提交
1372
		list = xrealloc(list, nr * sizeof(list[0]));
1373 1374
		list[nr - 1] = commit;
	}
1375
	total = nr;
1376 1377
	if (!keep_subject && auto_number && total > 1)
		numbered = 1;
1378
	if (numbered)
1379
		rev.total = total + start_number - 1;
1380 1381 1382 1383
	if (in_reply_to || thread || cover_letter)
		rev.ref_message_ids = xcalloc(1, sizeof(struct string_list));
	if (in_reply_to) {
		const char *msgid = clean_message_id(in_reply_to);
1384
		string_list_append(rev.ref_message_ids, msgid);
1385
	}
1386
	rev.numbered_files = just_numbers;
1387
	rev.patch_suffix = fmt_patch_suffix;
1388 1389 1390
	if (cover_letter) {
		if (thread)
			gen_message_id(&rev, "cover");
1391
		make_cover_letter(&rev, use_stdout,
1392
				  origin, nr, list, head, branch_name, quiet);
1393 1394 1395 1396
		total++;
		start_number--;
	}
	rev.add_signoff = add_signoff;
1397 1398 1399
	while (0 <= --nr) {
		int shown;
		commit = list[nr];
1400
		rev.nr = total - nr + (start_number - 1);
1401
		/* Make the second and subsequent mails replies to the first */
1402
		if (thread) {
1403
			/* Have we already had a message ID? */
1404
			if (rev.message_id) {
1405
				/*
1406 1407 1408 1409 1410 1411
				 * For deep threading: make every mail
				 * a reply to the previous one, no
				 * matter what other options are set.
				 *
				 * For shallow threading:
				 *
1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424
				 * Without --cover-letter and
				 * --in-reply-to, make every mail a
				 * reply to the one before.
				 *
				 * With --in-reply-to but no
				 * --cover-letter, make every mail a
				 * reply to the <reply-to>.
				 *
				 * With --cover-letter, make every
				 * mail but the cover letter a reply
				 * to the cover letter.  The cover
				 * letter is a reply to the
				 * --in-reply-to, if specified.
1425
				 */
1426 1427
				if (thread == THREAD_SHALLOW
				    && rev.ref_message_ids->nr > 0
1428
				    && (!cover_letter || rev.nr > 1))
1429 1430
					free(rev.message_id);
				else
1431 1432
					string_list_append(rev.ref_message_ids,
							   rev.message_id);
1433
			}
1434
			gen_message_id(&rev, sha1_to_hex(commit->object.sha1));
1435
		}
1436

1437
		if (!use_stdout &&
1438
		    reopen_stdout(rev.numbered_files ? NULL : commit, NULL, &rev, quiet))
1439
			die(_("Failed to create output files"));
1440 1441 1442
		shown = log_tree_commit(&rev, commit);
		free(commit->buffer);
		commit->buffer = NULL;
1443 1444 1445 1446 1447 1448 1449 1450 1451

		/* We put one extra blank line between formatted
		 * patches and this flag is used by log-tree code
		 * to see if it needs to emit a LF before showing
		 * the log; when using one file per patch, we do
		 * not want the extra blank line.
		 */
		if (!use_stdout)
			rev.shown_one = 0;
1452 1453 1454 1455 1456 1457
		if (shown) {
			if (rev.mime_boundary)
				printf("\n--%s%s--\n\n\n",
				       mime_boundary_leader,
				       rev.mime_boundary);
			else
1458
				print_signature();
1459
		}
1460 1461
		if (!use_stdout)
			fclose(stdout);
1462 1463
	}
	free(list);
1464
	free(branch_name);
1465 1466 1467
	string_list_clear(&extra_to, 0);
	string_list_clear(&extra_cc, 0);
	string_list_clear(&extra_hdr, 0);
1468 1469
	if (ignore_if_in_upstream)
		free_patch_ids(&ids);
1470 1471 1472
	return 0;
}

R
Rene Scharfe 已提交
1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486
static int add_pending_commit(const char *arg, struct rev_info *revs, int flags)
{
	unsigned char sha1[20];
	if (get_sha1(arg, sha1) == 0) {
		struct commit *commit = lookup_commit_reference(sha1);
		if (commit) {
			commit->object.flags |= flags;
			add_pending_object(revs, &commit->object, arg);
			return 0;
		}
	}
	return -1;
}

E
Erik Faye-Lund 已提交
1487
static const char * const cherry_usage[] = {
1488
	N_("git cherry [-v] [<upstream> [<head> [<limit>]]]"),
E
Erik Faye-Lund 已提交
1489 1490 1491
	NULL
};

1492 1493 1494 1495 1496 1497 1498 1499
static void print_commit(char sign, struct commit *commit, int verbose,
			 int abbrev)
{
	if (!verbose) {
		printf("%c %s\n", sign,
		       find_unique_abbrev(commit->object.sha1, abbrev));
	} else {
		struct strbuf buf = STRBUF_INIT;
1500
		pp_commit_easy(CMIT_FMT_ONELINE, commit, &buf);
1501 1502 1503 1504 1505 1506 1507
		printf("%c %s %s\n", sign,
		       find_unique_abbrev(commit->object.sha1, abbrev),
		       buf.buf);
		strbuf_release(&buf);
	}
}

R
Rene Scharfe 已提交
1508 1509 1510
int cmd_cherry(int argc, const char **argv, const char *prefix)
{
	struct rev_info revs;
1511
	struct patch_ids ids;
R
Rene Scharfe 已提交
1512 1513
	struct commit *commit;
	struct commit_list *list = NULL;
1514
	struct branch *current_branch;
R
Rene Scharfe 已提交
1515 1516 1517
	const char *upstream;
	const char *head = "HEAD";
	const char *limit = NULL;
E
Erik Faye-Lund 已提交
1518
	int verbose = 0, abbrev = 0;
R
Rene Scharfe 已提交
1519

E
Erik Faye-Lund 已提交
1520 1521
	struct option options[] = {
		OPT__ABBREV(&abbrev),
1522
		OPT__VERBOSE(&verbose, N_("be verbose")),
E
Erik Faye-Lund 已提交
1523 1524
		OPT_END()
	};
R
Rene Scharfe 已提交
1525

E
Erik Faye-Lund 已提交
1526
	argc = parse_options(argc, argv, prefix, options, cherry_usage, 0);
1527

R
Rene Scharfe 已提交
1528 1529
	switch (argc) {
	case 3:
E
Erik Faye-Lund 已提交
1530
		limit = argv[2];
R
Rene Scharfe 已提交
1531 1532
		/* FALLTHROUGH */
	case 2:
E
Erik Faye-Lund 已提交
1533 1534 1535 1536
		head = argv[1];
		/* FALLTHROUGH */
	case 1:
		upstream = argv[0];
R
Rene Scharfe 已提交
1537 1538
		break;
	default:
1539 1540 1541 1542
		current_branch = branch_get(NULL);
		if (!current_branch || !current_branch->merge
					|| !current_branch->merge[0]
					|| !current_branch->merge[0]->dst) {
1543
			fprintf(stderr, _("Could not find a tracked"
1544
					" remote branch, please"
1545
					" specify <upstream> manually.\n"));
E
Erik Faye-Lund 已提交
1546
			usage_with_options(cherry_usage, options);
1547 1548 1549
		}

		upstream = current_branch->merge[0]->dst;
R
Rene Scharfe 已提交
1550 1551 1552
	}

	init_revisions(&revs, prefix);
1553
	revs.max_parents = 1;
R
Rene Scharfe 已提交
1554 1555

	if (add_pending_commit(head, &revs, 0))
1556
		die(_("Unknown commit %s"), head);
R
Rene Scharfe 已提交
1557
	if (add_pending_commit(upstream, &revs, UNINTERESTING))
1558
		die(_("Unknown commit %s"), upstream);
R
Rene Scharfe 已提交
1559 1560 1561 1562 1563 1564 1565 1566

	/* Don't say anything if head and upstream are the same. */
	if (revs.pending.nr == 2) {
		struct object_array_entry *o = revs.pending.objects;
		if (hashcmp(o[0].item->sha1, o[1].item->sha1) == 0)
			return 0;
	}

1567
	get_patch_ids(&revs, &ids);
R
Rene Scharfe 已提交
1568 1569

	if (limit && add_pending_commit(limit, &revs, UNINTERESTING))
1570
		die(_("Unknown commit %s"), limit);
R
Rene Scharfe 已提交
1571 1572

	/* reverse the list of commits */
1573
	if (prepare_revision_walk(&revs))
1574
		die(_("revision walk setup failed"));
R
Rene Scharfe 已提交
1575 1576 1577 1578 1579 1580 1581 1582
	while ((commit = get_revision(&revs)) != NULL) {
		commit_list_insert(commit, &list);
	}

	while (list) {
		char sign = '+';

		commit = list->item;
1583
		if (has_commit_patch_id(commit, &ids))
R
Rene Scharfe 已提交
1584
			sign = '-';
1585
		print_commit(sign, commit, verbose, abbrev);
R
Rene Scharfe 已提交
1586 1587 1588
		list = list->next;
	}

1589
	free_patch_ids(&ids);
R
Rene Scharfe 已提交
1590 1591
	return 0;
}