log.c 44.5 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 "refs.h"
9
#include "color.h"
10 11 12 13
#include "commit.h"
#include "diff.h"
#include "revision.h"
#include "log-tree.h"
14
#include "builtin.h"
15
#include "tag.h"
L
Linus Torvalds 已提交
16
#include "reflog-walk.h"
17
#include "patch-ids.h"
18
#include "run-command.h"
19
#include "shortlog.h"
20
#include "remote.h"
21
#include "string-list.h"
22
#include "parse-options.h"
23
#include "line-log.h"
24
#include "branch.h"
25
#include "streaming.h"
26
#include "version.h"
A
Antoine Pelisse 已提交
27
#include "mailmap.h"
28
#include "gpg-interface.h"
29

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

33
static int default_abbrev_commit;
34
static int default_show_root = 1;
35
static int default_follow;
J
Junio C Hamano 已提交
36
static int decoration_style;
37
static int decoration_given;
38
static int use_mailmap_config;
39
static const char *fmt_patch_subject_prefix = "PATCH";
40
static const char *fmt_pretty;
41

42
static const char * const builtin_log_usage[] = {
43
	N_("git log [<options>] [<revision-range>] [[--] <path>...]"),
J
Junio C Hamano 已提交
44
	N_("git show [<options>] <object>..."),
45 46
	NULL
};
47

48 49 50 51 52 53
struct line_opt_callback_data {
	struct rev_info *rev;
	const char *prefix;
	struct string_list args;
};

J
Junio C Hamano 已提交
54 55 56 57 58 59 60 61 62 63 64 65 66 67
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;
68 69
	else if (!strcmp(value, "auto"))
		return (isatty(1) || pager_in_use()) ? DECORATE_SHORT_REFS : 0;
J
Junio C Hamano 已提交
70 71 72
	return -1;
}

73 74 75 76 77 78 79 80 81 82
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)
83
		die(_("invalid --decorate option: %s"), arg);
84 85 86 87 88 89

	decoration_given = 1;

	return 0;
}

90 91 92 93 94 95 96 97 98 99 100 101 102
static int log_line_range_callback(const struct option *option, const char *arg, int unset)
{
	struct line_opt_callback_data *data = option->value;

	if (!arg)
		return -1;

	data->rev->line_level_traverse = 1;
	string_list_append(&data->args, arg);

	return 0;
}

103
static void cmd_log_init_defaults(struct rev_info *rev)
104
{
105
	if (fmt_pretty)
106
		get_commit_format(fmt_pretty, rev);
107 108
	if (default_follow)
		DIFF_OPT_SET(&rev->diffopt, DEFAULT_FOLLOW_RENAMES);
109
	rev->verbose_header = 1;
110
	DIFF_OPT_SET(&rev->diffopt, RECURSIVE);
111
	rev->diffopt.stat_width = -1; /* use full terminal width */
112
	rev->diffopt.stat_graph_width = -1; /* respect statGraphWidth config */
113
	rev->abbrev_commit = default_abbrev_commit;
114
	rev->show_root_diff = default_show_root;
115
	rev->subject_prefix = fmt_patch_subject_prefix;
J
Jeff King 已提交
116
	DIFF_OPT_SET(&rev->diffopt, ALLOW_TEXTCONV);
H
Heikki Orsila 已提交
117 118

	if (default_date_mode)
119
		parse_date_format(default_date_mode, &rev->date_mode);
120
	rev->diffopt.touched_flags = 0;
121
}
H
Heikki Orsila 已提交
122

123 124 125 126
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 已提交
127
	int quiet = 0, source = 0, mailmap = 0;
128
	static struct line_opt_callback_data line_cb = {NULL, NULL, STRING_LIST_INIT_DUP};
129 130

	const struct option builtin_log_options[] = {
131
		OPT__QUIET(&quiet, N_("suppress diff output")),
F
Felipe Contreras 已提交
132 133
		OPT_BOOL(0, "source", &source, N_("show source")),
		OPT_BOOL(0, "use-mailmap", &mailmap, N_("Use mail map file")),
134
		{ OPTION_CALLBACK, 0, "decorate", NULL, NULL, N_("decorate options"),
135
		  PARSE_OPT_OPTARG, decorate_callback},
136
		OPT_CALLBACK('L', NULL, &line_cb, "n,m:file",
137
			     N_("Process line range n,m in file, counting from 1"),
138
			     log_line_range_callback),
139 140 141
		OPT_END()
	};

142 143 144
	line_cb.rev = rev;
	line_cb.prefix = prefix;

145
	mailmap = use_mailmap_config;
146 147 148 149
	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 已提交
150

151 152
	if (quiet)
		rev->diffopt.output_format |= DIFF_FORMAT_NO_OUTPUT;
J
Jeff King 已提交
153
	argc = setup_revisions(argc, argv, rev, opt);
H
Heikki Orsila 已提交
154

155 156
	/* Any arguments at this point are not recognized */
	if (argc > 1)
157
		die(_("unrecognized argument: %s"), argv[1]);
158

159 160 161 162
	memset(&w, 0, sizeof(w));
	userformat_find_requirements(NULL, &w);

	if (!rev->show_notes_given && (!rev->pretty_given || w.notes))
163
		rev->show_notes = 1;
164 165
	if (rev->show_notes)
		init_display_notes(&rev->notes_opt);
166

167 168
	if (rev->diffopt.pickaxe || rev->diffopt.filter ||
	    DIFF_OPT_TST(&rev->diffopt, FOLLOW_RENAMES))
169
		rev->always_show_header = 0;
170 171 172

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

A
Antoine Pelisse 已提交
174 175 176 177 178
	if (mailmap) {
		rev->mailmap = xcalloc(1, sizeof(struct string_list));
		read_mailmap(rev->mailmap, NULL);
	}

179 180 181 182 183 184 185 186 187 188
	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;
	}
189

190 191 192 193
	if (decoration_style) {
		rev->show_decorations = 1;
		load_ref_decorations(decoration_style);
	}
194 195 196 197

	if (rev->line_level_traverse)
		line_log_init(rev, line_cb.prefix, &line_cb.args);

198
	setup_pager();
199 200
}

201 202 203 204 205 206 207
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 已提交
208 209 210 211 212 213 214 215 216 217 218 219
/*
 * 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;
220
		if (!(flags & (TREESAME | UNINTERESTING)))
L
Linus Torvalds 已提交
221
			n++;
L
Linus Torvalds 已提交
222 223 224 225 226 227 228 229 230 231 232
	}
	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);
	}
233
	printf(_("Final output: %d %s\n"), nr, stage);
L
Linus Torvalds 已提交
234 235
}

236
static struct itimerval early_output_timer;
L
Linus Torvalds 已提交
237

238 239 240
static void log_show_early(struct rev_info *revs, struct commit_list *list)
{
	int i = revs->early_output;
L
Linus Torvalds 已提交
241
	int show_header = 1;
242

J
Junio C Hamano 已提交
243
	sort_in_topological_order(&list, revs->sort_order);
244 245
	while (list && i) {
		struct commit *commit = list->item;
L
Linus Torvalds 已提交
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
		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;
		}
261 262
		list = list->next;
	}
L
Linus Torvalds 已提交
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280

	/* 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);
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
}

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 已提交
312 313 314
	early_output_timer.it_value.tv_sec = 0;
	early_output_timer.it_value.tv_usec = 100000;
	setitimer(ITIMER_REAL, &early_output_timer, NULL);
315 316 317 318
}

static void finish_early_output(struct rev_info *rev)
{
L
Linus Torvalds 已提交
319
	int n = estimate_commit_count(rev, rev->commits);
320
	signal(SIGALRM, SIG_IGN);
L
Linus Torvalds 已提交
321
	show_early_header(rev, "done", n);
322 323
}

324 325 326
static int cmd_log_walk(struct rev_info *rev)
{
	struct commit *commit;
327 328
	int saved_nrl = 0;
	int saved_dcctc = 0;
329

330 331 332
	if (rev->early_output)
		setup_early_output(rev);

333
	if (prepare_revision_walk(rev))
334
		die(_("revision walk setup failed"));
335 336 337 338

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

339
	/*
340 341 342
	 * 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
343
	 */
344
	while ((commit = get_revision(rev)) != NULL) {
J
Junio C Hamano 已提交
345
		if (!log_tree_commit(rev, commit) && rev->max_count >= 0)
346 347 348 349 350
			/*
			 * We decremented max_count in get_revision,
			 * but we didn't actually show the commit.
			 */
			rev->max_count++;
351 352
		if (!rev->reflog_info) {
			/* we allow cycles in reflog ancestry */
353
			free_commit_buffer(commit);
354
		}
L
Linus Torvalds 已提交
355 356
		free_commit_list(commit->parents);
		commit->parents = NULL;
357 358 359 360
		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;
361
	}
362 363 364
	rev->diffopt.degraded_cc_to_c = saved_dcctc;
	rev->diffopt.needed_rename_limit = saved_nrl;

365 366 367 368
	if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
	    DIFF_OPT_TST(&rev->diffopt, CHECK_FAILED)) {
		return 02;
	}
369
	return diff_result_code(&rev->diffopt, 0);
370 371
}

372
static int git_log_config(const char *var, const char *value, void *cb)
373
{
374 375
	const char *slot_name;

376 377
	if (!strcmp(var, "format.pretty"))
		return git_config_string(&fmt_pretty, var, value);
378 379
	if (!strcmp(var, "format.subjectprefix"))
		return git_config_string(&fmt_patch_subject_prefix, var, value);
380 381 382 383
	if (!strcmp(var, "log.abbrevcommit")) {
		default_abbrev_commit = git_config_bool(var, value);
		return 0;
	}
H
Heikki Orsila 已提交
384 385
	if (!strcmp(var, "log.date"))
		return git_config_string(&default_date_mode, var, value);
386
	if (!strcmp(var, "log.decorate")) {
J
Junio C Hamano 已提交
387 388 389
		decoration_style = parse_decoration_style(var, value);
		if (decoration_style < 0)
			decoration_style = 0; /* maybe warn? */
390 391
		return 0;
	}
392 393 394 395
	if (!strcmp(var, "log.showroot")) {
		default_show_root = git_config_bool(var, value);
		return 0;
	}
396 397 398 399
	if (!strcmp(var, "log.follow")) {
		default_follow = git_config_bool(var, value);
		return 0;
	}
400
	if (skip_prefix(var, "color.decorate.", &slot_name))
401
		return parse_decorate_color_config(var, slot_name, value);
402 403 404 405 406
	if (!strcmp(var, "log.mailmap")) {
		use_mailmap_config = git_config_bool(var, value);
		return 0;
	}

J
Junio C Hamano 已提交
407 408
	if (grep_config(var, value, cb) < 0)
		return -1;
409
	if (git_gpg_config(var, value, cb) < 0)
J
Junio C Hamano 已提交
410
		return -1;
411
	return git_diff_ui_config(var, value, cb);
412 413
}

414
int cmd_whatchanged(int argc, const char **argv, const char *prefix)
415 416
{
	struct rev_info rev;
417
	struct setup_revision_opt opt;
418

J
Junio C Hamano 已提交
419
	init_grep_defaults();
420
	git_config(git_log_config, NULL);
421

422
	init_revisions(&rev, prefix);
423
	rev.diff = 1;
L
Linus Torvalds 已提交
424
	rev.simplify_history = 0;
425 426
	memset(&opt, 0, sizeof(opt));
	opt.def = "HEAD";
427
	opt.revarg_opt = REVARG_COMMITTISH;
428
	cmd_log_init(argc, argv, prefix, &rev, &opt);
429 430 431
	if (!rev.diffopt.output_format)
		rev.diffopt.output_format = DIFF_FORMAT_RAW;
	return cmd_log_walk(&rev);
432 433
}

434 435
static void show_tagger(char *buf, int len, struct rev_info *rev)
{
436
	struct strbuf out = STRBUF_INIT;
437
	struct pretty_print_context pp = {0};
438

439 440 441
	pp.fmt = rev->commit_format;
	pp.date_mode = rev->date_mode;
	pp_user_info(&pp, "Tagger", &out, buf, get_log_output_encoding());
442
	printf("%s", out.buf);
443
	strbuf_release(&out);
444 445
}

446
static int show_blob_object(const unsigned char *sha1, struct rev_info *rev, const char *obj_name)
447
{
448 449 450 451 452
	unsigned char sha1c[20];
	struct object_context obj_context;
	char *buf;
	unsigned long size;

453
	fflush(stdout);
454 455 456 457 458
	if (!DIFF_OPT_TOUCHED(&rev->diffopt, ALLOW_TEXTCONV) ||
	    !DIFF_OPT_TST(&rev->diffopt, ALLOW_TEXTCONV))
		return stream_blob_to_fd(1, sha1, NULL, 0);

	if (get_sha1_with_context(obj_name, 0, sha1c, &obj_context))
459
		die(_("Not a valid object name %s"), obj_name);
460 461 462 463 464
	if (!obj_context.path[0] ||
	    !textconv_object(obj_context.path, obj_context.mode, sha1c, 1, &buf, &size))
		return stream_blob_to_fd(1, sha1, NULL, 0);

	if (!buf)
465
		die(_("git show %s: bad file"), obj_name);
466 467 468

	write_or_die(1, buf, size);
	return 0;
469 470 471
}

static int show_tag_object(const unsigned char *sha1, struct rev_info *rev)
472 473
{
	unsigned long size;
474 475
	enum object_type type;
	char *buf = read_sha1_file(sha1, &type, &size);
476 477 478
	int offset = 0;

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

481 482 483 484 485
	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 */
486
		if (starts_with(buf + offset, "tagger "))
487 488 489 490
			show_tagger(buf + offset + 7,
				    new_offset - offset - 7, rev);
		offset = new_offset;
	}
491 492 493 494 495 496 497 498

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

static int show_tree_object(const unsigned char *sha1,
499
		struct strbuf *base,
500
		const char *pathname, unsigned mode, int stage, void *context)
501 502 503 504 505
{
	printf("%s%s\n", pathname, S_ISDIR(mode) ? "/" : "");
	return 0;
}

J
Junio C Hamano 已提交
506 507
static void show_setup_revisions_tweak(struct rev_info *rev,
				       struct setup_revision_opt *opt)
J
Junio C Hamano 已提交
508
{
509 510 511 512
	if (rev->ignore_merges) {
		/* There was no "-m" on the command line */
		rev->ignore_merges = 0;
		if (!rev->first_parent_only && !rev->combine_merges) {
J
Justin Lebar 已提交
513
			/* No "--first-parent", "-c", or "--cc" */
514 515 516 517
			rev->combine_merges = 1;
			rev->dense_combined_merges = 1;
		}
	}
J
Junio C Hamano 已提交
518 519 520 521
	if (!rev->diffopt.output_format)
		rev->diffopt.output_format = DIFF_FORMAT_PATCH;
}

522
int cmd_show(int argc, const char **argv, const char *prefix)
523 524
{
	struct rev_info rev;
525
	struct object_array_entry *objects;
526
	struct setup_revision_opt opt;
527
	struct pathspec match_all;
528
	int i, count, ret = 0;
529

J
Junio C Hamano 已提交
530
	init_grep_defaults();
531
	git_config(git_log_config, NULL);
532

533
	memset(&match_all, 0, sizeof(match_all));
534
	init_revisions(&rev, prefix);
535 536
	rev.diff = 1;
	rev.always_show_header = 1;
537
	rev.no_walk = REVISION_WALK_NO_WALK_SORTED;
538 539
	rev.diffopt.stat_width = -1; 	/* Scale to real terminal size */

540 541
	memset(&opt, 0, sizeof(opt));
	opt.def = "HEAD";
J
Junio C Hamano 已提交
542
	opt.tweak = show_setup_revisions_tweak;
543
	cmd_log_init(argc, argv, prefix, &rev, &opt);
544

545 546 547
	if (!rev.no_walk)
		return cmd_log_walk(&rev);

548 549 550 551 552 553 554
	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:
B
brian m. carlson 已提交
555
			ret = show_blob_object(o->oid.hash, &rev, name);
556 557 558 559
			break;
		case OBJ_TAG: {
			struct tag *t = (struct tag *)o;

560 561
			if (rev.shown_one)
				putchar('\n');
562
			printf("%stag %s%s\n",
563
					diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
564
					t->tag,
565
					diff_get_color_opt(&rev.diffopt, DIFF_RESET));
B
brian m. carlson 已提交
566
			ret = show_tag_object(o->oid.hash, &rev);
567
			rev.shown_one = 1;
568 569
			if (ret)
				break;
B
brian m. carlson 已提交
570
			o = parse_object(t->tagged->oid.hash);
571
			if (!o)
572
				ret = error(_("Could not read object %s"),
573
					    oid_to_hex(&t->tagged->oid));
574
			objects[i].item = o;
575 576 577 578
			i--;
			break;
		}
		case OBJ_TREE:
579 580
			if (rev.shown_one)
				putchar('\n');
581
			printf("%stree %s%s\n\n",
582
					diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
583
					name,
584
					diff_get_color_opt(&rev.diffopt, DIFF_RESET));
585
			read_tree_recursive((struct tree *)o, "", 0, 0, &match_all,
586
					show_tree_object, NULL);
587
			rev.shown_one = 1;
588 589 590 591 592 593 594 595
			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:
596
			ret = error(_("Unknown type: %d"), o->type);
597 598 599 600
		}
	}
	free(objects);
	return ret;
601 602
}

L
Linus Torvalds 已提交
603 604 605 606 607 608
/*
 * 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;
609
	struct setup_revision_opt opt;
L
Linus Torvalds 已提交
610

J
Junio C Hamano 已提交
611
	init_grep_defaults();
612
	git_config(git_log_config, NULL);
613

L
Linus Torvalds 已提交
614 615 616
	init_revisions(&rev, prefix);
	init_reflog_walk(&rev.reflog_info);
	rev.verbose_header = 1;
617 618
	memset(&opt, 0, sizeof(opt));
	opt.def = "HEAD";
619
	cmd_log_init_defaults(&rev);
620
	rev.abbrev_commit = 1;
L
Linus Torvalds 已提交
621
	rev.commit_format = CMIT_FMT_ONELINE;
622
	rev.use_terminator = 1;
L
Linus Torvalds 已提交
623
	rev.always_show_header = 1;
624
	cmd_log_init_finish(argc, argv, prefix, &rev, &opt);
L
Linus Torvalds 已提交
625 626 627 628

	return cmd_log_walk(&rev);
}

J
Junio C Hamano 已提交
629 630
static void log_setup_revisions_tweak(struct rev_info *rev,
				      struct setup_revision_opt *opt)
631 632 633 634
{
	if (DIFF_OPT_TST(&rev->diffopt, DEFAULT_FOLLOW_RENAMES) &&
	    rev->prune_data.nr == 1)
		DIFF_OPT_SET(&rev->diffopt, FOLLOW_RENAMES);
635 636 637 638

	/* Turn --cc/-c into -p --cc/-c when -p was not given */
	if (!rev->diffopt.output_format && rev->combine_merges)
		rev->diffopt.output_format = DIFF_FORMAT_PATCH;
639 640 641 642

	/* Turn -m on when --cc/-c was given */
	if (rev->combine_merges)
		rev->ignore_merges = 0;
643 644
}

645
int cmd_log(int argc, const char **argv, const char *prefix)
646 647
{
	struct rev_info rev;
648
	struct setup_revision_opt opt;
649

J
Junio C Hamano 已提交
650
	init_grep_defaults();
651
	git_config(git_log_config, NULL);
652

653
	init_revisions(&rev, prefix);
654
	rev.always_show_header = 1;
655 656
	memset(&opt, 0, sizeof(opt));
	opt.def = "HEAD";
657
	opt.revarg_opt = REVARG_COMMITTISH;
J
Junio C Hamano 已提交
658
	opt.tweak = log_setup_revisions_tweak;
659
	cmd_log_init(argc, argv, prefix, &rev, &opt);
660
	return cmd_log_walk(&rev);
661
}
662

663
/* format-patch */
664

665
static const char *fmt_patch_suffix = ".patch";
666
static int numbered = 0;
667
static int auto_number = 1;
668

669 670
static char *default_attach = NULL;

671 672 673
static struct string_list extra_hdr;
static struct string_list extra_to;
static struct string_list extra_cc;
D
Daniel Barkalow 已提交
674 675 676

static void add_header(const char *value)
{
677
	struct string_list_item *item;
D
Daniel Barkalow 已提交
678
	int len = strlen(value);
679
	while (len && value[len - 1] == '\n')
D
Daniel Barkalow 已提交
680
		len--;
681

D
Daniel Barkalow 已提交
682
	if (!strncasecmp(value, "to: ", 4)) {
683
		item = string_list_append(&extra_to, value + 4);
684 685
		len -= 4;
	} else if (!strncasecmp(value, "cc: ", 4)) {
686
		item = string_list_append(&extra_cc, value + 4);
687 688
		len -= 4;
	} else {
689
		item = string_list_append(&extra_hdr, value);
D
Daniel Barkalow 已提交
690
	}
691 692

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

695 696
#define THREAD_SHALLOW 1
#define THREAD_DEEP 2
697 698 699
static int thread;
static int do_signoff;
static const char *signature = git_version_string;
700
static const char *signature_file;
701 702 703 704 705 706 707 708
static int config_cover_letter;

enum {
	COVER_UNSET,
	COVER_OFF,
	COVER_ON,
	COVER_AUTO
};
709

710
static int git_format_config(const char *var, const char *value, void *cb)
711 712
{
	if (!strcmp(var, "format.headers")) {
713
		if (!value)
714
			die(_("format.headers without value"));
D
Daniel Barkalow 已提交
715
		add_header(value);
716 717
		return 0;
	}
718 719
	if (!strcmp(var, "format.suffix"))
		return git_config_string(&fmt_patch_suffix, var, value);
720 721 722
	if (!strcmp(var, "format.to")) {
		if (!value)
			return config_error_nonbool(var);
723
		string_list_append(&extra_to, value);
724 725
		return 0;
	}
726 727 728
	if (!strcmp(var, "format.cc")) {
		if (!value)
			return config_error_nonbool(var);
729
		string_list_append(&extra_cc, value);
730 731
		return 0;
	}
P
Pang Yan Han 已提交
732
	if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff") ||
733
	    !strcmp(var, "color.ui") || !strcmp(var, "diff.submodule")) {
734 735
		return 0;
	}
736
	if (!strcmp(var, "format.numbered")) {
737
		if (value && !strcasecmp(value, "auto")) {
738 739 740 741
			auto_number = 1;
			return 0;
		}
		numbered = git_config_bool(var, value);
742
		auto_number = auto_number && numbered;
743 744
		return 0;
	}
745 746 747 748 749 750 751
	if (!strcmp(var, "format.attach")) {
		if (value && *value)
			default_attach = xstrdup(value);
		else
			default_attach = xstrdup(git_version_string);
		return 0;
	}
752 753 754 755 756 757 758 759 760 761 762 763
	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;
	}
764 765 766 767
	if (!strcmp(var, "format.signoff")) {
		do_signoff = git_config_bool(var, value);
		return 0;
	}
768 769
	if (!strcmp(var, "format.signature"))
		return git_config_string(&signature, var, value);
770 771
	if (!strcmp(var, "format.signaturefile"))
		return git_config_pathname(&signature_file, var, value);
772 773 774 775 776 777 778 779
	if (!strcmp(var, "format.coverletter")) {
		if (value && !strcasecmp(value, "auto")) {
			config_cover_letter = COVER_AUTO;
			return 0;
		}
		config_cover_letter = git_config_bool(var, value) ? COVER_ON : COVER_OFF;
		return 0;
	}
780

781
	return git_log_config(var, value, cb);
782 783
}

784
static FILE *realstdout = NULL;
785
static const char *output_directory = NULL;
786
static int outdir_offset;
787

788 789
static int reopen_stdout(struct commit *commit, const char *subject,
			 struct rev_info *rev, int quiet)
790
{
791
	struct strbuf filename = STRBUF_INIT;
792
	int suffix_len = strlen(rev->patch_suffix) + 1;
793

794
	if (output_directory) {
795 796 797
		strbuf_addstr(&filename, output_directory);
		if (filename.len >=
		    PATH_MAX - FORMAT_PATCH_NAME_MAX - suffix_len)
798
			return error(_("name of output directory is too long"));
799
		strbuf_complete(&filename, '/');
800
	}
801

802 803
	if (rev->numbered_files)
		strbuf_addf(&filename, "%d", rev->nr);
804 805
	else if (commit)
		fmt_output_commit(&filename, commit, rev);
806
	else
807
		fmt_output_subject(&filename, subject, rev);
808

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

812
	if (freopen(filename.buf, "w", stdout) == NULL)
813
		return error(_("Cannot open patch file %s"), filename.buf);
814

815
	strbuf_release(&filename);
816
	return 0;
817 818
}

819
static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)
820 821
{
	struct rev_info check_rev;
822
	struct commit *commit, *c1, *c2;
823 824 825 826
	struct object *o1, *o2;
	unsigned flags1, flags2;

	if (rev->pending.nr != 2)
827
		die(_("Need exactly one range."));
828 829 830

	o1 = rev->pending.objects[0].item;
	o2 = rev->pending.objects[1].item;
831
	flags1 = o1->flags;
832
	flags2 = o2->flags;
B
brian m. carlson 已提交
833 834
	c1 = lookup_commit_reference(o1->oid.hash);
	c2 = lookup_commit_reference(o2->oid.hash);
835 836

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

839
	init_patch_ids(ids);
840 841

	/* given a range a..b get all patch ids for b..a */
842
	init_revisions(&check_rev, rev->prefix);
843
	check_rev.max_parents = 1;
844 845 846 847
	o1->flags ^= UNINTERESTING;
	o2->flags ^= UNINTERESTING;
	add_pending_object(&check_rev, o1, "o1");
	add_pending_object(&check_rev, o2, "o2");
848
	if (prepare_revision_walk(&check_rev))
849
		die(_("revision walk setup failed"));
850 851

	while ((commit = get_revision(&check_rev)) != NULL) {
852
		add_commit_patch_id(commit, ids);
853 854 855
	}

	/* reset for next revision walk */
856 857
	clear_commit_marks(c1, SEEN | UNINTERESTING | SHOWN | ADDED);
	clear_commit_marks(c2, SEEN | UNINTERESTING | SHOWN | ADDED);
858 859 860 861
	o1->flags = flags1;
	o2->flags = flags2;
}

862
static void gen_message_id(struct rev_info *info, char *base)
863
{
864
	struct strbuf buf = STRBUF_INIT;
865
	strbuf_addf(&buf, "%s.%lu.git.%s", base,
866
		    (unsigned long) time(NULL),
867
		    git_committer_info(IDENT_NO_NAME|IDENT_NO_DATE|IDENT_STRICT));
868
	info->message_id = strbuf_detach(&buf, NULL);
869 870
}

871 872
static void print_signature(void)
{
873 874 875 876 877 878 879
	if (!signature || !*signature)
		return;

	printf("-- \n%s", signature);
	if (signature[strlen(signature)-1] != '\n')
		putchar('\n');
	putchar('\n');
880 881
}

882 883 884 885 886 887 888 889
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');
890
		strbuf_addbuf(buf, &desc);
891 892
		strbuf_addch(buf, '\n');
	}
893
	strbuf_release(&desc);
894 895
}

896 897 898
static char *find_branch_name(struct rev_info *rev)
{
	int i, positive = -1;
899 900
	struct object_id branch_oid;
	const struct object_id *tip_oid;
901
	const char *ref, *v;
902 903 904 905 906 907 908 909 910 911 912 913 914
	char *full_ref, *branch = NULL;

	for (i = 0; i < rev->cmdline.nr; i++) {
		if (rev->cmdline.rev[i].flags & UNINTERESTING)
			continue;
		if (positive < 0)
			positive = i;
		else
			return NULL;
	}
	if (positive < 0)
		return NULL;
	ref = rev->cmdline.rev[positive].name;
915 916
	tip_oid = &rev->cmdline.rev[positive].item->oid;
	if (dwim_ref(ref, strlen(ref), branch_oid.hash, &full_ref) &&
917
	    skip_prefix(full_ref, "refs/heads/", &v) &&
918
	    !oidcmp(tip_oid, &branch_oid))
919
		branch = xstrdup(v);
920 921 922 923
	free(full_ref);
	return branch;
}

924 925
static void make_cover_letter(struct rev_info *rev, int use_stdout,
			      struct commit *origin,
926
			      int nr, struct commit **list,
927
			      const char *branch_name,
928
			      int quiet)
929 930 931 932
{
	const char *committer;
	const char *body = "*** SUBJECT HERE ***\n\n*** BLURB HERE ***\n";
	const char *msg;
933
	struct shortlog log;
934
	struct strbuf sb = STRBUF_INIT;
935
	int i;
936
	const char *encoding = "UTF-8";
937
	struct diff_options opts;
J
Junio C Hamano 已提交
938
	int need_8bit_cte = 0;
939
	struct pretty_print_context pp = {0};
940
	struct commit *head = list[0];
941 942

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

945
	committer = git_committer_info(0);
946

947
	if (!use_stdout &&
948
	    reopen_stdout(NULL, rev->numbered_files ? NULL : "cover-letter", rev, quiet))
949 950
		return;

951
	log_write_email_headers(rev, head, &pp.subject, &pp.after_subject,
J
Junio C Hamano 已提交
952
				&need_8bit_cte);
953

J
Jeff King 已提交
954
	for (i = 0; !need_8bit_cte && i < nr; i++) {
955
		const char *buf = get_commit_buffer(list[i], NULL);
J
Jeff King 已提交
956
		if (has_non_ascii(buf))
957
			need_8bit_cte = 1;
J
Jeff King 已提交
958 959
		unuse_commit_buffer(list[i], buf);
	}
960

961 962 963
	if (!branch_name)
		branch_name = find_branch_name(rev);

964
	msg = body;
965
	pp.fmt = CMIT_FMT_EMAIL;
966
	pp.date_mode.type = DATE_RFC2822;
967 968 969
	pp_user_info(&pp, NULL, &sb, committer, encoding);
	pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte);
	pp_remainder(&pp, &msg, &sb, 0);
970
	add_branch_description(&sb, branch_name);
971 972 973 974
	printf("%s\n", sb.buf);

	strbuf_release(&sb);

975
	shortlog_init(&log);
976 977 978 979
	log.wrap_lines = 1;
	log.wrap = 72;
	log.in1 = 2;
	log.in2 = 4;
980 981 982 983 984
	for (i = 0; i < nr; i++)
		shortlog_add_commit(&log, list[i]);

	shortlog_output(&log);

985
	/*
986
	 * We can only do diffstat with a unique reference point
987 988 989 990
	 */
	if (!origin)
		return;

991 992
	memcpy(&opts, &rev->diffopt, sizeof(opts));
	opts.output_format = DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
993

994 995
	diff_setup_done(&opts);

B
brian m. carlson 已提交
996 997
	diff_tree_sha1(origin->tree->object.oid.hash,
		       head->tree->object.oid.hash,
998 999 1000
		       "", &opts);
	diffcore_std(&opts);
	diff_flush(&opts);
1001 1002

	printf("\n");
1003
	print_signature();
1004 1005
}

1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
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)
1022
		die(_("insane in-reply-to: %s"), msg_id);
1023 1024
	if (++z == m)
		return a;
P
Pierre Habouzit 已提交
1025
	return xmemdupz(a, z - a);
1026 1027
}

1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
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));
}

1049
static const char * const builtin_format_patch_usage[] = {
1050
	N_("git format-patch [<options>] [<since> | <revision-range>]"),
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
	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;
}

1073 1074
static int numbered_cmdline_opt = 0;

1075 1076 1077
static int numbered_callback(const struct option *opt, const char *arg,
			     int unset)
{
1078
	*(int *)opt->value = numbered_cmdline_opt = unset ? 0 : 1;
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094
	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)
1095
		die(_("Two output directories?"));
1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141
	*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)
{
1142 1143 1144 1145 1146 1147 1148
	if (unset) {
		string_list_clear(&extra_hdr, 0);
		string_list_clear(&extra_to, 0);
		string_list_clear(&extra_cc, 0);
	} else {
	    add_header(arg);
	}
1149 1150 1151
	return 0;
}

1152 1153
static int to_callback(const struct option *opt, const char *arg, int unset)
{
1154 1155 1156
	if (unset)
		string_list_clear(&extra_to, 0);
	else
1157
		string_list_append(&extra_to, arg);
1158 1159 1160 1161 1162
	return 0;
}

static int cc_callback(const struct option *opt, const char *arg, int unset)
{
1163 1164 1165
	if (unset)
		string_list_clear(&extra_cc, 0);
	else
1166
		string_list_append(&extra_cc, arg);
1167 1168 1169
	return 0;
}

1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
static int from_callback(const struct option *opt, const char *arg, int unset)
{
	char **from = opt->value;

	free(*from);

	if (unset)
		*from = NULL;
	else if (arg)
		*from = xstrdup(arg);
	else
		*from = xstrdup(git_committer_info(IDENT_NO_DATE));
	return 0;
}

1185
int cmd_format_patch(int argc, const char **argv, const char *prefix)
1186 1187 1188 1189
{
	struct commit *commit;
	struct commit **list = NULL;
	struct rev_info rev;
1190
	struct setup_revision_opt s_r_opt;
1191
	int nr = 0, total, i;
1192
	int use_stdout = 0;
1193
	int start_number = -1;
1194
	int just_numbers = 0;
1195
	int ignore_if_in_upstream = 0;
1196
	int cover_letter = -1;
1197
	int boundary_count = 0;
1198
	int no_binary_diff = 0;
1199
	int zero_commit = 0;
1200
	struct commit *origin = NULL;
1201
	const char *in_reply_to = NULL;
1202
	struct patch_ids ids;
1203
	struct strbuf buf = STRBUF_INIT;
1204
	int use_patch_format = 0;
1205
	int quiet = 0;
1206
	int reroll_count = -1;
1207
	char *branch_name = NULL;
1208
	char *from = NULL;
1209 1210
	const struct option builtin_format_patch_options[] = {
		{ OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
1211
			    N_("use [PATCH n/m] even with a single patch"),
1212 1213
			    PARSE_OPT_NOARG, numbered_callback },
		{ OPTION_CALLBACK, 'N', "no-numbered", &numbered, NULL,
1214
			    N_("use [PATCH] even with multiple patches"),
1215
			    PARSE_OPT_NOARG, no_numbered_callback },
F
Felipe Contreras 已提交
1216 1217
		OPT_BOOL('s', "signoff", &do_signoff, N_("add Signed-off-by:")),
		OPT_BOOL(0, "stdout", &use_stdout,
1218
			    N_("print patches to standard out")),
F
Felipe Contreras 已提交
1219
		OPT_BOOL(0, "cover-letter", &cover_letter,
1220
			    N_("generate a cover letter")),
F
Felipe Contreras 已提交
1221
		OPT_BOOL(0, "numbered-files", &just_numbers,
1222 1223 1224
			    N_("use simple number sequence for output file names")),
		OPT_STRING(0, "suffix", &fmt_patch_suffix, N_("sfx"),
			    N_("use <sfx> instead of '.patch'")),
1225
		OPT_INTEGER(0, "start-number", &start_number,
1226
			    N_("start numbering patches at <n> instead of 1")),
1227
		OPT_INTEGER('v', "reroll-count", &reroll_count,
1228
			    N_("mark the series as Nth re-roll")),
1229 1230
		{ OPTION_CALLBACK, 0, "subject-prefix", &rev, N_("prefix"),
			    N_("Use [<prefix>] instead of [PATCH]"),
1231 1232
			    PARSE_OPT_NONEG, subject_prefix_callback },
		{ OPTION_CALLBACK, 'o', "output-directory", &output_directory,
1233
			    N_("dir"), N_("store resulting files in <dir>"),
1234 1235
			    PARSE_OPT_NONEG, output_directory_callback },
		{ OPTION_CALLBACK, 'k', "keep-subject", &rev, NULL,
1236
			    N_("don't strip/add [PATCH]"),
1237
			    PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback },
1238 1239
		OPT_BOOL(0, "no-binary", &no_binary_diff,
			 N_("don't output binary diffs")),
1240 1241
		OPT_BOOL(0, "zero-commit", &zero_commit,
			 N_("output all-zero hash in From header")),
1242 1243
		OPT_BOOL(0, "ignore-if-in-upstream", &ignore_if_in_upstream,
			 N_("don't include a patch matching a commit upstream")),
1244
		{ OPTION_SET_INT, 'p', "no-stat", &use_patch_format, NULL,
1245
		  N_("show patch format instead of default (patch + stat)"),
1246
		  PARSE_OPT_NONEG | PARSE_OPT_NOARG, NULL, 1},
1247 1248 1249 1250
		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"),
1251
			    0, to_callback },
1252
		{ OPTION_CALLBACK, 0, "cc", NULL, N_("email"), N_("add Cc: header"),
1253
			    0, cc_callback },
1254 1255 1256
		{ OPTION_CALLBACK, 0, "from", &from, N_("ident"),
			    N_("set From address to <ident> (or committer ident if absent)"),
			    PARSE_OPT_OPTARG, from_callback },
1257 1258 1259 1260
		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,
1261
			    attach_callback },
1262 1263
		{ OPTION_CALLBACK, 0, "inline", &rev, N_("boundary"),
			    N_("inline the patch"),
1264 1265
			    PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
			    inline_callback },
1266 1267
		{ OPTION_CALLBACK, 0, "thread", &thread, N_("style"),
			    N_("enable message threading, styles: shallow, deep"),
1268
			    PARSE_OPT_OPTARG, thread_callback },
1269 1270
		OPT_STRING(0, "signature", &signature, N_("signature"),
			    N_("add a signature")),
1271 1272
		OPT_FILENAME(0, "signature-file", &signature_file,
				N_("add a signature from a file")),
1273
		OPT__QUIET(&quiet, N_("don't print the patch filenames")),
1274 1275
		OPT_END()
	};
1276

1277 1278 1279
	extra_hdr.strdup_strings = 1;
	extra_to.strdup_strings = 1;
	extra_cc.strdup_strings = 1;
J
Junio C Hamano 已提交
1280
	init_grep_defaults();
1281
	git_config(git_format_config, NULL);
1282
	init_revisions(&rev, prefix);
1283 1284 1285
	rev.commit_format = CMIT_FMT_EMAIL;
	rev.verbose_header = 1;
	rev.diff = 1;
1286
	rev.max_parents = 1;
1287
	DIFF_OPT_SET(&rev.diffopt, RECURSIVE);
1288
	rev.subject_prefix = fmt_patch_subject_prefix;
1289 1290
	memset(&s_r_opt, 0, sizeof(s_r_opt));
	s_r_opt.def = "HEAD";
1291
	s_r_opt.revarg_opt = REVARG_COMMITTISH;
1292

1293 1294 1295 1296 1297
	if (default_attach) {
		rev.mime_boundary = default_attach;
		rev.no_inline = 1;
	}

1298 1299
	/*
	 * Parse the arguments before setup_revisions(), or something
1300
	 * like "git format-patch -o a123 HEAD^.." may fail; a123 is
1301 1302
	 * possibly a valid SHA1.
	 */
1303
	argc = parse_options(argc, argv, prefix, builtin_format_patch_options,
1304
			     builtin_format_patch_usage,
1305 1306
			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
			     PARSE_OPT_KEEP_DASHDASH);
1307

1308 1309 1310 1311 1312 1313 1314 1315
	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);
	}

1316 1317
	for (i = 0; i < extra_hdr.nr; i++) {
		strbuf_addstr(&buf, extra_hdr.items[i].string);
D
Daniel Barkalow 已提交
1318 1319 1320
		strbuf_addch(&buf, '\n');
	}

1321
	if (extra_to.nr)
D
Daniel Barkalow 已提交
1322
		strbuf_addstr(&buf, "To: ");
1323
	for (i = 0; i < extra_to.nr; i++) {
D
Daniel Barkalow 已提交
1324 1325
		if (i)
			strbuf_addstr(&buf, "    ");
1326 1327
		strbuf_addstr(&buf, extra_to.items[i].string);
		if (i + 1 < extra_to.nr)
D
Daniel Barkalow 已提交
1328 1329 1330 1331
			strbuf_addch(&buf, ',');
		strbuf_addch(&buf, '\n');
	}

1332
	if (extra_cc.nr)
D
Daniel Barkalow 已提交
1333
		strbuf_addstr(&buf, "Cc: ");
1334
	for (i = 0; i < extra_cc.nr; i++) {
D
Daniel Barkalow 已提交
1335 1336
		if (i)
			strbuf_addstr(&buf, "    ");
1337 1338
		strbuf_addstr(&buf, extra_cc.items[i].string);
		if (i + 1 < extra_cc.nr)
D
Daniel Barkalow 已提交
1339 1340 1341 1342
			strbuf_addch(&buf, ',');
		strbuf_addch(&buf, '\n');
	}

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

1345 1346 1347 1348 1349
	if (from) {
		if (split_ident_line(&rev.from_ident, from, strlen(from)))
			die(_("invalid ident line: %s"), from);
	}

1350
	if (start_number < 0)
1351
		start_number = 1;
1352 1353 1354 1355 1356 1357 1358 1359 1360

	/*
	 * 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;

1361
	if (numbered && keep_subject)
1362
		die (_("-n and -k are mutually exclusive."));
1363
	if (keep_subject && subject_prefix)
1364
		die (_("--subject-prefix and -k are mutually exclusive."));
1365
	rev.preserve_subject = keep_subject;
1366

1367
	argc = setup_revisions(argc, argv, &rev, &s_r_opt);
1368
	if (argc > 1)
1369
		die (_("unrecognized argument: %s"), argv[1]);
1370

1371
	if (rev.diffopt.output_format & DIFF_FORMAT_NAME)
1372
		die(_("--name-only does not make sense"));
1373
	if (rev.diffopt.output_format & DIFF_FORMAT_NAME_STATUS)
1374
		die(_("--name-status does not make sense"));
1375
	if (rev.diffopt.output_format & DIFF_FORMAT_CHECKDIFF)
1376
		die(_("--check does not make sense"));
1377 1378 1379 1380 1381 1382 1383 1384

	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;
1385

1386 1387
	rev.zero_commit = zero_commit;

1388
	if (!DIFF_OPT_TST(&rev.diffopt, TEXT) && !no_binary_diff)
1389
		DIFF_OPT_SET(&rev.diffopt, BINARY);
1390

1391 1392 1393
	if (rev.show_notes)
		init_display_notes(&rev.notes_opt);

1394 1395
	if (!use_stdout)
		output_directory = set_outdir(prefix, output_directory);
1396 1397
	else
		setup_pager();
1398

1399 1400
	if (output_directory) {
		if (use_stdout)
1401
			die(_("standard output, or directory, which one?"));
1402
		if (mkdir(output_directory, 0777) < 0 && errno != EEXIST)
1403
			die_errno(_("Could not create directory '%s'"),
1404
				  output_directory);
1405 1406
	}

1407
	if (rev.pending.nr == 1) {
1408 1409
		int check_head = 0;

1410 1411 1412 1413 1414 1415
		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.
			 */
J
Junio C Hamano 已提交
1416
			rev.pending.objects[0].item->flags |= UNINTERESTING;
1417
			add_head_to_pending(&rev);
1418
			check_head = 1;
J
Junio C Hamano 已提交
1419
		}
1420 1421 1422 1423
		/*
		 * 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 已提交
1424
		 */
1425 1426 1427 1428 1429 1430

		if (!strcmp(rev.pending.objects[0].name, "HEAD"))
			check_head = 1;

		if (check_head) {
			unsigned char sha1[20];
1431
			const char *ref, *v;
1432 1433
			ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
						 sha1, NULL);
1434 1435
			if (ref && skip_prefix(ref, "refs/heads/", &v))
				branch_name = xstrdup(v);
1436 1437 1438
			else
				branch_name = xstrdup(""); /* no branch */
		}
1439
	}
1440 1441 1442

	/*
	 * We cannot move this anywhere earlier because we do want to
1443
	 * know if --root was given explicitly from the command line.
1444 1445 1446
	 */
	rev.show_root_diff = 1;

1447 1448 1449 1450
	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;
1451
			if (oidcmp(&o[0].item->oid, &o[1].item->oid) == 0)
1452 1453
				return 0;
		}
1454
		get_patch_ids(&rev, &ids);
1455
	}
1456

1457
	if (!use_stdout)
1458
		realstdout = xfdopen(xdup(1), "w");
1459

1460
	if (prepare_revision_walk(&rev))
1461
		die(_("revision walk setup failed"));
1462
	rev.boundary = 1;
1463
	while ((commit = get_revision(&rev)) != NULL) {
1464 1465 1466 1467 1468 1469
		if (commit->object.flags & BOUNDARY) {
			boundary_count++;
			origin = (boundary_count == 1) ? commit : NULL;
			continue;
		}

J
Junio C Hamano 已提交
1470
		if (ignore_if_in_upstream && has_commit_patch_id(commit, &ids))
1471 1472
			continue;

1473
		nr++;
1474
		REALLOC_ARRAY(list, nr);
1475 1476
		list[nr - 1] = commit;
	}
1477 1478 1479
	if (nr == 0)
		/* nothing to do */
		return 0;
1480
	total = nr;
1481 1482
	if (!keep_subject && auto_number && total > 1)
		numbered = 1;
1483
	if (numbered)
1484
		rev.total = total + start_number - 1;
1485 1486 1487 1488 1489 1490 1491
	if (cover_letter == -1) {
		if (config_cover_letter == COVER_AUTO)
			cover_letter = (total > 1);
		else
			cover_letter = (config_cover_letter == COVER_ON);
	}

1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503
	if (!signature) {
		; /* --no-signature inhibits all signatures */
	} else if (signature && signature != git_version_string) {
		; /* non-default signature already set */
	} else if (signature_file) {
		struct strbuf buf = STRBUF_INIT;

		if (strbuf_read_file(&buf, signature_file, 128) < 0)
			die_errno(_("unable to read signature file '%s'"), signature_file);
		signature = strbuf_detach(&buf, NULL);
	}

1504 1505 1506 1507
	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);
1508
		string_list_append(rev.ref_message_ids, msgid);
1509
	}
1510
	rev.numbered_files = just_numbers;
1511
	rev.patch_suffix = fmt_patch_suffix;
1512 1513 1514
	if (cover_letter) {
		if (thread)
			gen_message_id(&rev, "cover");
1515
		make_cover_letter(&rev, use_stdout,
1516
				  origin, nr, list, branch_name, quiet);
1517 1518 1519
		total++;
		start_number--;
	}
1520
	rev.add_signoff = do_signoff;
1521 1522 1523
	while (0 <= --nr) {
		int shown;
		commit = list[nr];
1524
		rev.nr = total - nr + (start_number - 1);
1525
		/* Make the second and subsequent mails replies to the first */
1526
		if (thread) {
1527
			/* Have we already had a message ID? */
1528
			if (rev.message_id) {
1529
				/*
1530 1531 1532 1533 1534 1535
				 * For deep threading: make every mail
				 * a reply to the previous one, no
				 * matter what other options are set.
				 *
				 * For shallow threading:
				 *
1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548
				 * 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.
1549
				 */
1550 1551
				if (thread == THREAD_SHALLOW
				    && rev.ref_message_ids->nr > 0
1552
				    && (!cover_letter || rev.nr > 1))
1553 1554
					free(rev.message_id);
				else
1555 1556
					string_list_append(rev.ref_message_ids,
							   rev.message_id);
1557
			}
1558
			gen_message_id(&rev, oid_to_hex(&commit->object.oid));
1559
		}
1560

1561
		if (!use_stdout &&
1562
		    reopen_stdout(rev.numbered_files ? NULL : commit, NULL, &rev, quiet))
1563
			die(_("Failed to create output files"));
1564
		shown = log_tree_commit(&rev, commit);
1565
		free_commit_buffer(commit);
1566 1567 1568 1569 1570 1571 1572 1573 1574

		/* 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;
1575 1576 1577 1578 1579 1580
		if (shown) {
			if (rev.mime_boundary)
				printf("\n--%s%s--\n\n\n",
				       mime_boundary_leader,
				       rev.mime_boundary);
			else
1581
				print_signature();
1582
		}
1583 1584
		if (!use_stdout)
			fclose(stdout);
1585 1586
	}
	free(list);
1587
	free(branch_name);
1588 1589 1590
	string_list_clear(&extra_to, 0);
	string_list_clear(&extra_cc, 0);
	string_list_clear(&extra_hdr, 0);
1591 1592
	if (ignore_if_in_upstream)
		free_patch_ids(&ids);
1593 1594 1595
	return 0;
}

R
Rene Scharfe 已提交
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609
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 已提交
1610
static const char * const cherry_usage[] = {
1611
	N_("git cherry [-v] [<upstream> [<head> [<limit>]]]"),
E
Erik Faye-Lund 已提交
1612 1613 1614
	NULL
};

1615 1616 1617 1618 1619
static void print_commit(char sign, struct commit *commit, int verbose,
			 int abbrev)
{
	if (!verbose) {
		printf("%c %s\n", sign,
B
brian m. carlson 已提交
1620
		       find_unique_abbrev(commit->object.oid.hash, abbrev));
1621 1622
	} else {
		struct strbuf buf = STRBUF_INIT;
1623
		pp_commit_easy(CMIT_FMT_ONELINE, commit, &buf);
1624
		printf("%c %s %s\n", sign,
B
brian m. carlson 已提交
1625
		       find_unique_abbrev(commit->object.oid.hash, abbrev),
1626 1627 1628 1629 1630
		       buf.buf);
		strbuf_release(&buf);
	}
}

R
Rene Scharfe 已提交
1631 1632 1633
int cmd_cherry(int argc, const char **argv, const char *prefix)
{
	struct rev_info revs;
1634
	struct patch_ids ids;
R
Rene Scharfe 已提交
1635 1636
	struct commit *commit;
	struct commit_list *list = NULL;
1637
	struct branch *current_branch;
R
Rene Scharfe 已提交
1638 1639 1640
	const char *upstream;
	const char *head = "HEAD";
	const char *limit = NULL;
E
Erik Faye-Lund 已提交
1641
	int verbose = 0, abbrev = 0;
R
Rene Scharfe 已提交
1642

E
Erik Faye-Lund 已提交
1643 1644
	struct option options[] = {
		OPT__ABBREV(&abbrev),
1645
		OPT__VERBOSE(&verbose, N_("be verbose")),
E
Erik Faye-Lund 已提交
1646 1647
		OPT_END()
	};
R
Rene Scharfe 已提交
1648

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

R
Rene Scharfe 已提交
1651 1652
	switch (argc) {
	case 3:
E
Erik Faye-Lund 已提交
1653
		limit = argv[2];
R
Rene Scharfe 已提交
1654 1655
		/* FALLTHROUGH */
	case 2:
E
Erik Faye-Lund 已提交
1656 1657 1658 1659
		head = argv[1];
		/* FALLTHROUGH */
	case 1:
		upstream = argv[0];
R
Rene Scharfe 已提交
1660 1661
		break;
	default:
1662
		current_branch = branch_get(NULL);
1663
		upstream = branch_get_upstream(current_branch, NULL);
1664
		if (!upstream) {
1665
			fprintf(stderr, _("Could not find a tracked"
1666
					" remote branch, please"
1667
					" specify <upstream> manually.\n"));
E
Erik Faye-Lund 已提交
1668
			usage_with_options(cherry_usage, options);
1669
		}
R
Rene Scharfe 已提交
1670 1671 1672
	}

	init_revisions(&revs, prefix);
1673
	revs.max_parents = 1;
R
Rene Scharfe 已提交
1674 1675

	if (add_pending_commit(head, &revs, 0))
1676
		die(_("Unknown commit %s"), head);
R
Rene Scharfe 已提交
1677
	if (add_pending_commit(upstream, &revs, UNINTERESTING))
1678
		die(_("Unknown commit %s"), upstream);
R
Rene Scharfe 已提交
1679 1680 1681 1682

	/* Don't say anything if head and upstream are the same. */
	if (revs.pending.nr == 2) {
		struct object_array_entry *o = revs.pending.objects;
1683
		if (oidcmp(&o[0].item->oid, &o[1].item->oid) == 0)
R
Rene Scharfe 已提交
1684 1685 1686
			return 0;
	}

1687
	get_patch_ids(&revs, &ids);
R
Rene Scharfe 已提交
1688 1689

	if (limit && add_pending_commit(limit, &revs, UNINTERESTING))
1690
		die(_("Unknown commit %s"), limit);
R
Rene Scharfe 已提交
1691 1692

	/* reverse the list of commits */
1693
	if (prepare_revision_walk(&revs))
1694
		die(_("revision walk setup failed"));
R
Rene Scharfe 已提交
1695 1696 1697 1698 1699 1700 1701 1702
	while ((commit = get_revision(&revs)) != NULL) {
		commit_list_insert(commit, &list);
	}

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

		commit = list->item;
1703
		if (has_commit_patch_id(commit, &ids))
R
Rene Scharfe 已提交
1704
			sign = '-';
1705
		print_commit(sign, commit, verbose, abbrev);
R
Rene Scharfe 已提交
1706 1707 1708
		list = list->next;
	}

1709
	free_patch_ids(&ids);
R
Rene Scharfe 已提交
1710 1711
	return 0;
}