commit.c 45.3 KB
Newer Older
K
Kristian Høgsberg 已提交
1 2 3 4 5 6 7 8 9
/*
 * Builtin "git commit"
 *
 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
 * Based on git-commit.sh by Junio C Hamano and Linus Torvalds
 */

#include "cache.h"
#include "cache-tree.h"
10
#include "color.h"
11
#include "dir.h"
K
Kristian Høgsberg 已提交
12 13 14 15 16 17 18 19 20 21 22 23
#include "builtin.h"
#include "diff.h"
#include "diffcore.h"
#include "commit.h"
#include "revision.h"
#include "wt-status.h"
#include "run-command.h"
#include "refs.h"
#include "log-tree.h"
#include "strbuf.h"
#include "utf8.h"
#include "parse-options.h"
24
#include "string-list.h"
25
#include "rerere.h"
26
#include "unpack-trees.h"
27
#include "quote.h"
28
#include "submodule.h"
J
Junio C Hamano 已提交
29
#include "gpg-interface.h"
N
Nguyễn Thái Ngọc Duy 已提交
30
#include "column.h"
K
Kristian Høgsberg 已提交
31 32

static const char * const builtin_commit_usage[] = {
S
Stephan Beyer 已提交
33
	"git commit [options] [--] <filepattern>...",
K
Kristian Høgsberg 已提交
34 35 36
	NULL
};

37
static const char * const builtin_status_usage[] = {
S
Stephan Beyer 已提交
38
	"git status [options] [--] <filepattern>...",
39 40 41
	NULL
};

42
static const char implicit_ident_advice[] =
43
N_("Your name and email address were configured automatically based\n"
44 45 46
"on your username and hostname. Please check that they are accurate.\n"
"You can suppress this message by setting them explicitly:\n"
"\n"
47
"    git config --global user.name \"Your Name\"\n"
48 49
"    git config --global user.email you@example.com\n"
"\n"
50
"After doing this, you may fix the identity used for this commit with:\n"
51
"\n"
52
"    git commit --amend --reset-author\n");
53

J
Jeff King 已提交
54
static const char empty_amend_advice[] =
55
N_("You asked to amend the most recent commit, but doing so would make\n"
J
Jeff King 已提交
56
"it empty. You can repeat your command with --allow-empty, or you can\n"
57
"remove the commit entirely with \"git reset HEAD^\".\n");
J
Jeff King 已提交
58

59
static const char empty_cherry_pick_advice[] =
J
Junio C Hamano 已提交
60
N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
61 62 63 64
"If you wish to commit it anyway, use:\n"
"\n"
"    git commit --allow-empty\n"
"\n"
J
Junio C Hamano 已提交
65
"Otherwise, please use 'git reset'\n");
66 67

static const char *use_message_buffer;
K
Kristian Høgsberg 已提交
68
static const char commit_editmsg[] = "COMMIT_EDITMSG";
69 70 71 72 73
static struct lock_file index_lock; /* real index */
static struct lock_file false_lock; /* used only for partial commits */
static enum {
	COMMIT_AS_IS = 1,
	COMMIT_NORMAL,
74
	COMMIT_PARTIAL
75
} commit_style;
K
Kristian Høgsberg 已提交
76

77
static const char *logfile, *force_author;
78
static const char *template_file;
79 80 81 82 83
/*
 * The _message variables are commit names from which to take
 * the commit message and/or authorship.
 */
static const char *author_message, *author_message_buffer;
K
Kristian Høgsberg 已提交
84
static char *edit_message, *use_message;
85
static char *fixup_message, *squash_message;
J
Junio C Hamano 已提交
86 87
static int all, also, interactive, patch_interactive, only, amend, signoff;
static int edit_flag = -1; /* unspecified */
88
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
89
static int no_post_rewrite, allow_empty_message;
90
static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
J
Junio C Hamano 已提交
91 92
static char *sign_commit;

93 94 95 96 97 98 99 100 101 102
/*
 * The default commit message cleanup mode will remove the lines
 * beginning with # (shell comments) and leading and trailing
 * whitespaces (empty lines or containing only whitespaces)
 * if editor is used, and only the whitespaces if the message
 * is specified explicitly.
 */
static enum {
	CLEANUP_SPACE,
	CLEANUP_NONE,
103
	CLEANUP_ALL
104 105
} cleanup_mode;
static char *cleanup_arg;
K
Kristian Høgsberg 已提交
106

107
static enum commit_whence whence;
108
static int use_editor = 1, include_status = 1;
109
static int show_ignored_in_status;
110
static const char *only_include_assumed;
111
static struct strbuf message = STRBUF_INIT;
112

113 114 115
static enum {
	STATUS_FORMAT_LONG,
	STATUS_FORMAT_SHORT,
116
	STATUS_FORMAT_PORCELAIN
117 118
} status_format = STATUS_FORMAT_LONG;

119 120 121 122 123 124 125
static int opt_parse_m(const struct option *opt, const char *arg, int unset)
{
	struct strbuf *buf = opt->value;
	if (unset)
		strbuf_setlen(buf, 0);
	else {
		strbuf_addstr(buf, arg);
126
		strbuf_addstr(buf, "\n\n");
127 128 129
	}
	return 0;
}
K
Kristian Høgsberg 已提交
130

131 132 133 134 135 136 137 138 139 140 141 142
static void determine_whence(struct wt_status *s)
{
	if (file_exists(git_path("MERGE_HEAD")))
		whence = FROM_MERGE;
	else if (file_exists(git_path("CHERRY_PICK_HEAD")))
		whence = FROM_CHERRY_PICK;
	else
		whence = FROM_COMMIT;
	if (s)
		s->whence = whence;
}

143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
static void rollback_index_files(void)
{
	switch (commit_style) {
	case COMMIT_AS_IS:
		break; /* nothing to do */
	case COMMIT_NORMAL:
		rollback_lock_file(&index_lock);
		break;
	case COMMIT_PARTIAL:
		rollback_lock_file(&index_lock);
		rollback_lock_file(&false_lock);
		break;
	}
}

158
static int commit_index_files(void)
159
{
160 161
	int err = 0;

162 163 164 165
	switch (commit_style) {
	case COMMIT_AS_IS:
		break; /* nothing to do */
	case COMMIT_NORMAL:
166
		err = commit_lock_file(&index_lock);
167 168
		break;
	case COMMIT_PARTIAL:
169
		err = commit_lock_file(&index_lock);
170 171 172
		rollback_lock_file(&false_lock);
		break;
	}
173 174

	return err;
175 176 177 178 179 180
}

/*
 * Take a union of paths in the index and the named tree (typically, "HEAD"),
 * and return the paths that match the given pattern in list.
 */
181
static int list_paths(struct string_list *list, const char *with_tree,
182 183 184 185 186 187 188 189 190
		      const char *prefix, const char **pattern)
{
	int i;
	char *m;

	for (i = 0; pattern[i]; i++)
		;
	m = xcalloc(1, i);

191
	if (with_tree) {
192
		char *max_prefix = common_prefix(pattern);
193 194
		overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
		free(max_prefix);
195
	}
196 197 198

	for (i = 0; i < active_nr; i++) {
		struct cache_entry *ce = active_cache[i];
199 200
		struct string_list_item *item;

201
		if (ce->ce_flags & CE_UPDATE)
202
			continue;
203
		if (!match_pathspec(pattern, ce->name, ce_namelen(ce), 0, m))
204
			continue;
205
		item = string_list_insert(list, ce->name);
206 207
		if (ce_skip_worktree(ce))
			item->util = item; /* better a valid pointer than a fake one */
208 209
	}

210
	return report_path_error(m, pattern, prefix);
211 212
}

213
static void add_remove_files(struct string_list *list)
214 215 216
{
	int i;
	for (i = 0; i < list->nr; i++) {
217
		struct stat st;
218
		struct string_list_item *p = &(list->items[i]);
219

220 221
		/* p->util is skip-worktree */
		if (p->util)
222
			continue;
223

224 225
		if (!lstat(p->string, &st)) {
			if (add_to_cache(p->string, &st, 0))
226
				die(_("updating files failed"));
227
		} else
228
			remove_file_from_cache(p->string);
229 230 231
	}
}

232
static void create_base_index(const struct commit *current_head)
233 234 235 236 237
{
	struct tree *tree;
	struct unpack_trees_options opts;
	struct tree_desc t;

238
	if (!current_head) {
239 240 241 242 243 244 245 246
		discard_cache();
		return;
	}

	memset(&opts, 0, sizeof(opts));
	opts.head_idx = 1;
	opts.index_only = 1;
	opts.merge = 1;
247 248
	opts.src_index = &the_index;
	opts.dst_index = &the_index;
249 250

	opts.fn = oneway_merge;
251
	tree = parse_tree_indirect(current_head->object.sha1);
252
	if (!tree)
253
		die(_("failed to unpack HEAD tree object"));
254 255
	parse_tree(tree);
	init_tree_desc(&t, tree->buffer, tree->size);
256 257
	if (unpack_trees(1, &t, &opts))
		exit(128); /* We've already reported the error, finish dying */
258 259
}

260 261 262 263 264 265 266 267 268 269
static void refresh_cache_or_die(int refresh_flags)
{
	/*
	 * refresh_flags contains REFRESH_QUIET, so the only errors
	 * are for unmerged entries.
	 */
	if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
		die_resolve_conflict("commit");
}

270 271
static char *prepare_index(int argc, const char **argv, const char *prefix,
			   const struct commit *current_head, int is_status)
K
Kristian Høgsberg 已提交
272 273
{
	int fd;
274
	struct string_list partial;
275
	const char **pathspec = NULL;
276
	char *old_index_env = NULL;
277
	int refresh_flags = REFRESH_QUIET;
K
Kristian Høgsberg 已提交
278

279 280
	if (is_status)
		refresh_flags |= REFRESH_UNMERGED;
K
Kristian Høgsberg 已提交
281

282 283
	if (*argv)
		pathspec = get_pathspec(prefix, argv);
284

L
Linus Torvalds 已提交
285
	if (read_cache_preload(pathspec) < 0)
286
		die(_("index file corrupt"));
L
Linus Torvalds 已提交
287

288 289 290 291 292 293 294 295 296 297 298 299
	if (interactive) {
		fd = hold_locked_index(&index_lock, 1);

		refresh_cache_or_die(refresh_flags);

		if (write_cache(fd, active_cache, active_nr) ||
		    close_lock_file(&index_lock))
			die(_("unable to create temporary index"));

		old_index_env = getenv(INDEX_ENVIRONMENT);
		setenv(INDEX_ENVIRONMENT, index_lock.filename, 1);

300
		if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
301 302 303 304 305 306 307 308 309 310 311 312 313 314
			die(_("interactive add failed"));

		if (old_index_env && *old_index_env)
			setenv(INDEX_ENVIRONMENT, old_index_env, 1);
		else
			unsetenv(INDEX_ENVIRONMENT);

		discard_cache();
		read_cache_from(index_lock.filename);

		commit_style = COMMIT_NORMAL;
		return index_lock.filename;
	}

315 316 317 318 319 320 321 322 323 324 325 326 327
	/*
	 * Non partial, non as-is commit.
	 *
	 * (1) get the real index;
	 * (2) update the_index as necessary;
	 * (3) write the_index out to the real index (still locked);
	 * (4) return the name of the locked index file.
	 *
	 * The caller should run hooks on the locked real index, and
	 * (A) if all goes well, commit the real index;
	 * (B) on failure, rollback the real index.
	 */
	if (all || (also && pathspec && *pathspec)) {
328
		fd = hold_locked_index(&index_lock, 1);
329
		add_files_to_cache(also ? prefix : NULL, pathspec, 0);
330
		refresh_cache_or_die(refresh_flags);
331
		update_main_cache_tree(WRITE_TREE_SILENT);
B
Brandon Casey 已提交
332 333
		if (write_cache(fd, active_cache, active_nr) ||
		    close_lock_file(&index_lock))
334
			die(_("unable to write new_index file"));
335 336
		commit_style = COMMIT_NORMAL;
		return index_lock.filename;
K
Kristian Høgsberg 已提交
337 338
	}

339 340 341 342 343
	/*
	 * As-is commit.
	 *
	 * (1) return the name of the real index file.
	 *
344 345
	 * The caller should run hooks on the real index,
	 * and create commit from the_index.
346 347 348 349
	 * We still need to refresh the index here.
	 */
	if (!pathspec || !*pathspec) {
		fd = hold_locked_index(&index_lock, 1);
350
		refresh_cache_or_die(refresh_flags);
351
		if (active_cache_changed) {
352
			update_main_cache_tree(WRITE_TREE_SILENT);
353 354
			if (write_cache(fd, active_cache, active_nr) ||
			    commit_locked_index(&index_lock))
355
				die(_("unable to write new_index file"));
356 357 358
		} else {
			rollback_lock_file(&index_lock);
		}
359
		commit_style = COMMIT_AS_IS;
K
Kristian Høgsberg 已提交
360 361 362
		return get_index_file();
	}

363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
	/*
	 * A partial commit.
	 *
	 * (0) find the set of affected paths;
	 * (1) get lock on the real index file;
	 * (2) update the_index with the given paths;
	 * (3) write the_index out to the real index (still locked);
	 * (4) get lock on the false index file;
	 * (5) reset the_index from HEAD;
	 * (6) update the_index the same way as (2);
	 * (7) write the_index out to the false index file;
	 * (8) return the name of the false index file (still locked);
	 *
	 * The caller should run hooks on the locked false index, and
	 * create commit from it.  Then
	 * (A) if all goes well, commit the real index;
	 * (B) on failure, rollback the real index;
	 * In either case, rollback the false index.
	 */
	commit_style = COMMIT_PARTIAL;

384 385 386 387 388 389
	if (whence != FROM_COMMIT) {
		if (whence == FROM_MERGE)
			die(_("cannot do a partial commit during a merge."));
		else if (whence == FROM_CHERRY_PICK)
			die(_("cannot do a partial commit during a cherry-pick."));
	}
390 391

	memset(&partial, 0, sizeof(partial));
392
	partial.strdup_strings = 1;
393
	if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec))
394 395 396 397
		exit(1);

	discard_cache();
	if (read_cache() < 0)
398
		die(_("cannot read the index"));
399 400 401

	fd = hold_locked_index(&index_lock, 1);
	add_remove_files(&partial);
402
	refresh_cache(REFRESH_QUIET);
B
Brandon Casey 已提交
403 404
	if (write_cache(fd, active_cache, active_nr) ||
	    close_lock_file(&index_lock))
405
		die(_("unable to write new_index file"));
K
Kristian Høgsberg 已提交
406

407
	fd = hold_lock_file_for_update(&false_lock,
J
Junio C Hamano 已提交
408 409
				       git_path("next-index-%"PRIuMAX,
						(uintmax_t) getpid()),
410
				       LOCK_DIE_ON_ERROR);
411

412
	create_base_index(current_head);
413
	add_remove_files(&partial);
414
	refresh_cache(REFRESH_QUIET);
K
Kristian Høgsberg 已提交
415

B
Brandon Casey 已提交
416 417
	if (write_cache(fd, active_cache, active_nr) ||
	    close_lock_file(&false_lock))
418
		die(_("unable to write temporary index file"));
419 420 421 422

	discard_cache();
	read_cache_from(false_lock.filename);

423
	return false_lock.filename;
K
Kristian Høgsberg 已提交
424 425
}

426 427
static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
		      struct wt_status *s)
K
Kristian Høgsberg 已提交
428
{
429 430
	unsigned char sha1[20];

431 432
	if (s->relative_paths)
		s->prefix = prefix;
K
Kristian Høgsberg 已提交
433 434

	if (amend) {
435 436
		s->amend = 1;
		s->reference = "HEAD^1";
K
Kristian Høgsberg 已提交
437
	}
438 439 440 441
	s->verbose = verbose;
	s->index_file = index_file;
	s->fp = fp;
	s->nowarn = nowarn;
442
	s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
K
Kristian Høgsberg 已提交
443

444
	wt_status_collect(s);
445 446 447

	switch (status_format) {
	case STATUS_FORMAT_SHORT:
448
		wt_shortstatus_print(s);
449 450
		break;
	case STATUS_FORMAT_PORCELAIN:
451
		wt_porcelain_print(s);
452 453 454 455 456
		break;
	case STATUS_FORMAT_LONG:
		wt_status_print(s);
		break;
	}
K
Kristian Høgsberg 已提交
457

458
	return s->commitable;
K
Kristian Høgsberg 已提交
459 460
}

461
static int is_a_merge(const struct commit *current_head)
462
{
463
	return !!(current_head->parents && current_head->parents->next);
464 465
}

K
Kristian Høgsberg 已提交
466 467
static const char sign_off_header[] = "Signed-off-by: ";

468 469 470 471 472 473 474 475 476 477
static void export_one(const char *var, const char *s, const char *e, int hack)
{
	struct strbuf buf = STRBUF_INIT;
	if (hack)
		strbuf_addch(&buf, hack);
	strbuf_addf(&buf, "%.*s", (int)(e - s), s);
	setenv(var, buf.buf, 1);
	strbuf_release(&buf);
}

478
static void determine_author_info(struct strbuf *author_ident)
479 480
{
	char *name, *email, *date;
481
	struct ident_split author;
482 483 484 485 486

	name = getenv("GIT_AUTHOR_NAME");
	email = getenv("GIT_AUTHOR_EMAIL");
	date = getenv("GIT_AUTHOR_DATE");

487
	if (author_message) {
488
		const char *a, *lb, *rb, *eol;
489
		size_t len;
490

491
		a = strstr(author_message_buffer, "\nauthor ");
492
		if (!a)
J
Junio C Hamano 已提交
493
			die(_("invalid commit: %s"), author_message);
494

495 496 497 498
		lb = strchrnul(a + strlen("\nauthor "), '<');
		rb = strchrnul(lb, '>');
		eol = strchrnul(rb, '\n');
		if (!*lb || !*rb || !*eol)
J
Junio C Hamano 已提交
499
			die(_("invalid commit: %s"), author_message);
500

501 502 503 504 505 506 507 508 509
		if (lb == a + strlen("\nauthor "))
			/* \nauthor <foo@example.com> */
			name = xcalloc(1, 1);
		else
			name = xmemdupz(a + strlen("\nauthor "),
					(lb - strlen(" ") -
					 (a + strlen("\nauthor "))));
		email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
		date = xmemdupz(rb + strlen("> "), eol - (rb + strlen("> ")));
510 511 512 513 514
		len = eol - (rb + strlen("> "));
		date = xmalloc(len + 2);
		*date = '@';
		memcpy(date + 1, rb + strlen("> "), len);
		date[len + 1] = '\0';
515 516 517 518 519 520 521
	}

	if (force_author) {
		const char *lb = strstr(force_author, " <");
		const char *rb = strchr(force_author, '>');

		if (!lb || !rb)
522
			die(_("malformed --author parameter"));
523 524 525 526
		name = xstrndup(force_author, lb - force_author);
		email = xstrndup(lb + 2, rb - (lb + 2));
	}

M
Miklos Vajna 已提交
527 528
	if (force_date)
		date = force_date;
529 530
	strbuf_addstr(author_ident, fmt_ident(name, email, date,
					      IDENT_ERROR_ON_NO_NAME));
531 532 533 534 535
	if (!split_ident_line(&author, author_ident->buf, author_ident->len)) {
		export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
		export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
		export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
	}
536 537
}

538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578
static int ends_rfc2822_footer(struct strbuf *sb)
{
	int ch;
	int hit = 0;
	int i, j, k;
	int len = sb->len;
	int first = 1;
	const char *buf = sb->buf;

	for (i = len - 1; i > 0; i--) {
		if (hit && buf[i] == '\n')
			break;
		hit = (buf[i] == '\n');
	}

	while (i < len - 1 && buf[i] == '\n')
		i++;

	for (; i < len; i = k) {
		for (k = i; k < len && buf[k] != '\n'; k++)
			; /* do nothing */
		k++;

		if ((buf[k] == ' ' || buf[k] == '\t') && !first)
			continue;

		first = 0;

		for (j = 0; i + j < len; j++) {
			ch = buf[i + j];
			if (ch == ':')
				break;
			if (isalnum(ch) ||
			    (ch == '-'))
				continue;
			return 0;
		}
	}
	return 1;
}

579 580 581 582
static char *cut_ident_timestamp_part(char *string)
{
	char *ket = strrchr(string, '>');
	if (!ket || ket[1] != ' ')
583
		die(_("Malformed ident string: '%s'"), string);
584 585 586 587
	*++ket = '\0';
	return ket;
}

588
static int prepare_to_commit(const char *index_file, const char *prefix,
589
			     struct commit *current_head,
590 591
			     struct wt_status *s,
			     struct strbuf *author_ident)
K
Kristian Høgsberg 已提交
592 593
{
	struct stat statbuf;
594
	struct strbuf committer_ident = STRBUF_INIT;
595
	int commitable, saved_color_setting;
596
	struct strbuf sb = STRBUF_INIT;
K
Kristian Høgsberg 已提交
597
	char *buffer;
598 599
	const char *hook_arg1 = NULL;
	const char *hook_arg2 = NULL;
600
	int ident_shown = 0;
601
	int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
K
Kristian Høgsberg 已提交
602

603 604 605
	/* This checks and barfs if author is badly specified */
	determine_author_info(author_ident);

606 607
	if (!no_verify && run_hook(index_file, "pre-commit", NULL))
		return 0;
K
Kristian Høgsberg 已提交
608

609 610 611 612 613 614 615 616 617 618 619 620
	if (squash_message) {
		/*
		 * Insert the proper subject line before other commit
		 * message options add their content.
		 */
		if (use_message && !strcmp(use_message, squash_message))
			strbuf_addstr(&sb, "squash! ");
		else {
			struct pretty_print_context ctx = {0};
			struct commit *c;
			c = lookup_commit_reference_by_name(squash_message);
			if (!c)
621
				die(_("could not lookup commit %s"), squash_message);
622 623 624 625 626 627
			ctx.output_encoding = get_commit_output_encoding();
			format_commit_message(c, "squash! %s\n\n", &sb,
					      &ctx);
		}
	}

628 629
	if (message.len) {
		strbuf_addbuf(&sb, &message);
630
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
631 632
	} else if (logfile && !strcmp(logfile, "-")) {
		if (isatty(0))
633
			fprintf(stderr, _("(reading log message from standard input)\n"));
K
Kristian Høgsberg 已提交
634
		if (strbuf_read(&sb, 0, 0) < 0)
635
			die_errno(_("could not read log from standard input"));
636
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
637 638
	} else if (logfile) {
		if (strbuf_read_file(&sb, logfile, 0) < 0)
639
			die_errno(_("could not read log file '%s'"),
640
				  logfile);
641
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
642 643 644
	} else if (use_message) {
		buffer = strstr(use_message_buffer, "\n\n");
		if (!buffer || buffer[2] == '\0')
645
			die(_("commit has empty message"));
K
Kristian Høgsberg 已提交
646
		strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
647 648
		hook_arg1 = "commit";
		hook_arg2 = use_message;
649 650 651 652 653
	} else if (fixup_message) {
		struct pretty_print_context ctx = {0};
		struct commit *commit;
		commit = lookup_commit_reference_by_name(fixup_message);
		if (!commit)
654
			die(_("could not lookup commit %s"), fixup_message);
655 656 657 658
		ctx.output_encoding = get_commit_output_encoding();
		format_commit_message(commit, "fixup! %s\n\n",
				      &sb, &ctx);
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
659 660
	} else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
		if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
661
			die_errno(_("could not read MERGE_MSG"));
662
		hook_arg1 = "merge";
K
Kristian Høgsberg 已提交
663 664
	} else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
		if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
665
			die_errno(_("could not read SQUASH_MSG"));
666
		hook_arg1 = "squash";
667
	} else if (template_file) {
K
Kristian Høgsberg 已提交
668
		if (strbuf_read_file(&sb, template_file, 0) < 0)
669
			die_errno(_("could not read '%s'"), template_file);
670
		hook_arg1 = "template";
671
		clean_message_contents = 0;
K
Kristian Høgsberg 已提交
672 673
	}

674
	/*
675 676
	 * The remaining cases don't modify the template message, but
	 * just set the argument(s) to the prepare-commit-msg hook.
677
	 */
678
	else if (whence == FROM_MERGE)
679
		hook_arg1 = "merge";
680 681 682 683
	else if (whence == FROM_CHERRY_PICK) {
		hook_arg1 = "commit";
		hook_arg2 = "CHERRY_PICK_HEAD";
	}
684

685 686 687 688 689 690 691 692 693 694
	if (squash_message) {
		/*
		 * If squash_commit was used for the commit subject,
		 * then we're possibly hijacking other commit log options.
		 * Reset the hook args to tell the real story.
		 */
		hook_arg1 = "message";
		hook_arg2 = "";
	}

695 696
	s->fp = fopen(git_path(commit_editmsg), "w");
	if (s->fp == NULL)
697
		die_errno(_("could not open '%s'"), git_path(commit_editmsg));
K
Kristian Høgsberg 已提交
698

699
	if (clean_message_contents)
700
		stripspace(&sb, 0);
K
Kristian Høgsberg 已提交
701 702

	if (signoff) {
703
		struct strbuf sob = STRBUF_INIT;
704 705 706
		int i;

		strbuf_addstr(&sob, sign_off_header);
707 708
		strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
					     getenv("GIT_COMMITTER_EMAIL")));
709 710 711
		strbuf_addch(&sob, '\n');
		for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
			; /* do nothing */
712
		if (prefixcmp(sb.buf + i, sob.buf)) {
713
			if (!i || !ends_rfc2822_footer(&sb))
714
				strbuf_addch(&sb, '\n');
715
			strbuf_addbuf(&sb, &sob);
716
		}
717
		strbuf_release(&sob);
K
Kristian Høgsberg 已提交
718 719
	}

720
	if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
721
		die_errno(_("could not write commit template"));
722

K
Kristian Høgsberg 已提交
723 724
	strbuf_release(&sb);

725
	/* This checks if committer ident is explicitly given */
726
	strbuf_addstr(&committer_ident, git_committer_info(0));
727
	if (use_editor && include_status) {
728
		char *ai_tmp, *ci_tmp;
729
		if (whence != FROM_COMMIT)
730
			status_printf_ln(s, GIT_COLOR_NORMAL,
731 732 733 734 735 736 737 738 739 740 741
			    whence == FROM_MERGE
				? _("\n"
					"It looks like you may be committing a merge.\n"
					"If this is not correct, please remove the file\n"
					"	%s\n"
					"and try again.\n")
				: _("\n"
					"It looks like you may be committing a cherry-pick.\n"
					"If this is not correct, please remove the file\n"
					"	%s\n"
					"and try again.\n"),
742 743 744
				git_path(whence == FROM_MERGE
					 ? "MERGE_HEAD"
					 : "CHERRY_PICK_HEAD"));
745

746
		fprintf(s->fp, "\n");
747
		if (cleanup_mode == CLEANUP_ALL)
748 749 750
			status_printf(s, GIT_COLOR_NORMAL,
				_("Please enter the commit message for your changes."
				" Lines starting\nwith '#' will be ignored, and an empty"
751
				" message aborts the commit.\n"));
752
		else /* CLEANUP_SPACE, that is. */
753 754 755
			status_printf(s, GIT_COLOR_NORMAL,
				_("Please enter the commit message for your changes."
				" Lines starting\n"
756
				"with '#' will be kept; you may remove them"
J
Jeff King 已提交
757
				" yourself if you want to.\n"
758
				"An empty message aborts the commit.\n"));
759
		if (only_include_assumed)
760 761
			status_printf_ln(s, GIT_COLOR_NORMAL,
					"%s", only_include_assumed);
762

763 764 765
		ai_tmp = cut_ident_timestamp_part(author_ident->buf);
		ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
		if (strcmp(author_ident->buf, committer_ident.buf))
766
			status_printf_ln(s, GIT_COLOR_NORMAL,
767 768
				_("%s"
				"Author:    %s"),
769
				ident_shown++ ? "" : "\n",
770
				author_ident->buf);
771

772
		if (!user_ident_sufficiently_given())
773
			status_printf_ln(s, GIT_COLOR_NORMAL,
774 775
				_("%s"
				"Committer: %s"),
776
				ident_shown++ ? "" : "\n",
777
				committer_ident.buf);
778 779

		if (ident_shown)
780
			status_printf_ln(s, GIT_COLOR_NORMAL, "");
781

782 783
		saved_color_setting = s->use_color;
		s->use_color = 0;
784
		commitable = run_status(s->fp, index_file, prefix, 1, s);
785
		s->use_color = saved_color_setting;
786 787 788

		*ai_tmp = ' ';
		*ci_tmp = ' ';
789
	} else {
790
		unsigned char sha1[20];
791
		const char *parent = "HEAD";
792 793

		if (!active_nr && read_cache() < 0)
794
			die(_("Cannot read index"));
795

796 797 798
		if (amend)
			parent = "HEAD^1";

799
		if (get_sha1(parent, sha1))
800
			commitable = !!active_nr;
801 802
		else
			commitable = index_differs_from(parent, 0);
803
	}
804
	strbuf_release(&committer_ident);
805

806
	fclose(s->fp);
807

808 809 810 811 812 813
	/*
	 * Reject an attempt to record a non-merge empty commit without
	 * explicit --allow-empty. In the cherry-pick case, it may be
	 * empty due to conflict resolution, which the user should okay.
	 */
	if (!commitable && whence != FROM_MERGE && !allow_empty &&
814
	    !(amend && is_a_merge(current_head))) {
815
		run_status(stdout, index_file, prefix, 0, s);
J
Jeff King 已提交
816
		if (amend)
817
			fputs(_(empty_amend_advice), stderr);
818
		else if (whence == FROM_CHERRY_PICK)
J
Junio C Hamano 已提交
819
			fputs(_(empty_cherry_pick_advice), stderr);
820
		return 0;
821 822
	}

823 824 825 826 827 828 829
	/*
	 * Re-read the index as pre-commit hook could have updated it,
	 * and write it out as a tree.  We must do this before we invoke
	 * the editor and after we invoke run_status above.
	 */
	discard_cache();
	read_cache_from(index_file);
830
	if (update_main_cache_tree(0)) {
831
		error(_("Error building trees"));
832
		return 0;
833
	}
K
Kristian Høgsberg 已提交
834

835 836 837
	if (run_hook(index_file, "prepare-commit-msg",
		     git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
		return 0;
K
Kristian Høgsberg 已提交
838

839 840
	if (use_editor) {
		char index[PATH_MAX];
841 842
		const char *env[2] = { NULL };
		env[0] =  index;
843
		snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
S
Stephan Beyer 已提交
844 845
		if (launch_editor(git_path(commit_editmsg), NULL, env)) {
			fprintf(stderr,
846
			_("Please supply the message using either -m or -F option.\n"));
S
Stephan Beyer 已提交
847 848
			exit(1);
		}
849
	}
K
Kristian Høgsberg 已提交
850

851 852 853 854
	if (!no_verify &&
	    run_hook(index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
		return 0;
	}
K
Kristian Høgsberg 已提交
855

856
	return 1;
K
Kristian Høgsberg 已提交
857 858
}

859
static int rest_is_empty(struct strbuf *sb, int start)
K
Kristian Høgsberg 已提交
860
{
861
	int i, eol;
K
Kristian Høgsberg 已提交
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884
	const char *nl;

	/* Check if the rest is just whitespace and Signed-of-by's. */
	for (i = start; i < sb->len; i++) {
		nl = memchr(sb->buf + i, '\n', sb->len - i);
		if (nl)
			eol = nl - sb->buf;
		else
			eol = sb->len;

		if (strlen(sign_off_header) <= eol - i &&
		    !prefixcmp(sb->buf + i, sign_off_header)) {
			i = eol;
			continue;
		}
		while (i < eol)
			if (!isspace(sb->buf[i++]))
				return 0;
	}

	return 1;
}

885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918
/*
 * Find out if the message in the strbuf contains only whitespace and
 * Signed-off-by lines.
 */
static int message_is_empty(struct strbuf *sb)
{
	if (cleanup_mode == CLEANUP_NONE && sb->len)
		return 0;
	return rest_is_empty(sb, 0);
}

/*
 * See if the user edited the message in the editor or left what
 * was in the template intact
 */
static int template_untouched(struct strbuf *sb)
{
	struct strbuf tmpl = STRBUF_INIT;
	char *start;

	if (cleanup_mode == CLEANUP_NONE && sb->len)
		return 0;

	if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
		return 0;

	stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
	start = (char *)skip_prefix(sb->buf, tmpl.buf);
	if (!start)
		start = sb->buf;
	strbuf_release(&tmpl);
	return rest_is_empty(sb, start - sb->buf);
}

919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
static const char *find_author_by_nickname(const char *name)
{
	struct rev_info revs;
	struct commit *commit;
	struct strbuf buf = STRBUF_INIT;
	const char *av[20];
	int ac = 0;

	init_revisions(&revs, NULL);
	strbuf_addf(&buf, "--author=%s", name);
	av[++ac] = "--all";
	av[++ac] = "-i";
	av[++ac] = buf.buf;
	av[++ac] = NULL;
	setup_revisions(ac, av, &revs, NULL);
	prepare_revision_walk(&revs);
	commit = get_revision(&revs);
	if (commit) {
937 938
		struct pretty_print_context ctx = {0};
		ctx.date_mode = DATE_NORMAL;
939
		strbuf_release(&buf);
940
		format_commit_message(commit, "%an <%ae>", &buf, &ctx);
941 942
		return strbuf_detach(&buf, NULL);
	}
943
	die(_("No existing author found with '%s'"), name);
944 945
}

946 947 948 949 950 951 952 953 954 955 956 957

static void handle_untracked_files_arg(struct wt_status *s)
{
	if (!untracked_files_arg)
		; /* default already initialized */
	else if (!strcmp(untracked_files_arg, "no"))
		s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
	else if (!strcmp(untracked_files_arg, "normal"))
		s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
	else if (!strcmp(untracked_files_arg, "all"))
		s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
	else
958
		die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
959 960
}

961 962 963 964 965 966 967
static const char *read_commit_message(const char *name)
{
	const char *out_enc, *out;
	struct commit *commit;

	commit = lookup_commit_reference_by_name(name);
	if (!commit)
J
Junio C Hamano 已提交
968
		die(_("could not lookup commit %s"), name);
969 970 971 972 973 974 975 976 977 978 979 980 981 982
	out_enc = get_commit_output_encoding();
	out = logmsg_reencode(commit, out_enc);

	/*
	 * If we failed to reencode the buffer, just copy it
	 * byte for byte so the user can try to fix it up.
	 * This also handles the case where input and output
	 * encodings are identical.
	 */
	if (out == NULL)
		out = xstrdup(commit->buffer);
	return out;
}

983
static int parse_and_validate_options(int argc, const char *argv[],
J
Jeff King 已提交
984
				      const struct option *options,
985
				      const char * const usage[],
986
				      const char *prefix,
987
				      struct commit *current_head,
988
				      struct wt_status *s)
K
Kristian Høgsberg 已提交
989 990 991
{
	int f = 0;

J
Jeff King 已提交
992
	argc = parse_options(argc, argv, prefix, options, usage, 0);
K
Kristian Høgsberg 已提交
993

994 995 996
	if (force_author && !strchr(force_author, '>'))
		force_author = find_author_by_nickname(force_author);

997
	if (force_author && renew_authorship)
998
		die(_("Using both --reset-author and --author does not make sense"));
999

1000
	if (logfile || message.len || use_message || fixup_message)
1001
		use_editor = 0;
J
Junio C Hamano 已提交
1002 1003
	if (0 <= edit_flag)
		use_editor = edit_flag;
1004 1005
	if (!use_editor)
		setenv("GIT_EDITOR", ":", 1);
K
Kristian Høgsberg 已提交
1006 1007

	/* Sanity check options */
1008
	if (amend && !current_head)
1009
		die(_("You have nothing to amend."));
1010 1011 1012 1013 1014 1015
	if (amend && whence != FROM_COMMIT) {
		if (whence == FROM_MERGE)
			die(_("You are in the middle of a merge -- cannot amend."));
		else if (whence == FROM_CHERRY_PICK)
			die(_("You are in the middle of a cherry-pick -- cannot amend."));
	}
1016
	if (fixup_message && squash_message)
1017
		die(_("Options --squash and --fixup cannot be used together"));
K
Kristian Høgsberg 已提交
1018 1019 1020 1021
	if (use_message)
		f++;
	if (edit_message)
		f++;
1022 1023
	if (fixup_message)
		f++;
K
Kristian Høgsberg 已提交
1024 1025 1026
	if (logfile)
		f++;
	if (f > 1)
1027
		die(_("Only one of -c/-C/-F/--fixup can be used."));
1028
	if (message.len && f > 0)
1029
		die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1030 1031
	if (f || message.len)
		template_file = NULL;
K
Kristian Høgsberg 已提交
1032 1033
	if (edit_message)
		use_message = edit_message;
1034
	if (amend && !use_message && !fixup_message)
K
Kristian Høgsberg 已提交
1035
		use_message = "HEAD";
1036
	if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1037
		die(_("--reset-author can be used only with -C, -c or --amend."));
K
Kristian Høgsberg 已提交
1038
	if (use_message) {
1039 1040 1041 1042 1043 1044 1045 1046 1047
		use_message_buffer = read_commit_message(use_message);
		if (!renew_authorship) {
			author_message = use_message;
			author_message_buffer = use_message_buffer;
		}
	}
	if (whence == FROM_CHERRY_PICK && !renew_authorship) {
		author_message = "CHERRY_PICK_HEAD";
		author_message_buffer = read_commit_message(author_message);
K
Kristian Høgsberg 已提交
1048 1049
	}

1050 1051 1052
	if (patch_interactive)
		interactive = 1;

K
Kristian Høgsberg 已提交
1053
	if (!!also + !!only + !!all + !!interactive > 1)
1054
		die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
K
Kristian Høgsberg 已提交
1055
	if (argc == 0 && (also || (only && !amend)))
1056
		die(_("No paths with --include/--only does not make sense."));
K
Kristian Høgsberg 已提交
1057
	if (argc == 0 && only && amend)
1058
		only_include_assumed = _("Clever... amending the last one with dirty index.");
1059
	if (argc > 0 && !also && !only)
1060
		only_include_assumed = _("Explicit paths specified without -i nor -o; assuming --only paths...");
1061 1062 1063 1064 1065 1066 1067 1068 1069
	if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
		cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
	else if (!strcmp(cleanup_arg, "verbatim"))
		cleanup_mode = CLEANUP_NONE;
	else if (!strcmp(cleanup_arg, "whitespace"))
		cleanup_mode = CLEANUP_SPACE;
	else if (!strcmp(cleanup_arg, "strip"))
		cleanup_mode = CLEANUP_ALL;
	else
1070
		die(_("Invalid cleanup mode %s"), cleanup_arg);
K
Kristian Høgsberg 已提交
1071

1072
	handle_untracked_files_arg(s);
1073

K
Kristian Høgsberg 已提交
1074
	if (all && argc > 0)
1075
		die(_("Paths with -a does not make sense."));
K
Kristian Høgsberg 已提交
1076

1077
	if (s->null_termination && status_format == STATUS_FORMAT_LONG)
1078 1079 1080 1081
		status_format = STATUS_FORMAT_PORCELAIN;
	if (status_format != STATUS_FORMAT_LONG)
		dry_run = 1;

K
Kristian Høgsberg 已提交
1082 1083 1084
	return argc;
}

1085
static int dry_run_commit(int argc, const char **argv, const char *prefix,
1086
			  const struct commit *current_head, struct wt_status *s)
K
Kristian Høgsberg 已提交
1087 1088
{
	int commitable;
J
Junio C Hamano 已提交
1089
	const char *index_file;
K
Kristian Høgsberg 已提交
1090

1091
	index_file = prepare_index(argc, argv, prefix, current_head, 1);
1092
	commitable = run_status(stdout, index_file, prefix, 0, s);
J
Junio C Hamano 已提交
1093
	rollback_index_files();
K
Kristian Høgsberg 已提交
1094

J
Junio C Hamano 已提交
1095 1096 1097
	return commitable ? 0 : 1;
}

1098 1099 1100 1101
static int parse_status_slot(const char *var, int offset)
{
	if (!strcasecmp(var+offset, "header"))
		return WT_STATUS_HEADER;
1102 1103
	if (!strcasecmp(var+offset, "branch"))
		return WT_STATUS_ONBRANCH;
1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
	if (!strcasecmp(var+offset, "updated")
		|| !strcasecmp(var+offset, "added"))
		return WT_STATUS_UPDATED;
	if (!strcasecmp(var+offset, "changed"))
		return WT_STATUS_CHANGED;
	if (!strcasecmp(var+offset, "untracked"))
		return WT_STATUS_UNTRACKED;
	if (!strcasecmp(var+offset, "nobranch"))
		return WT_STATUS_NOBRANCH;
	if (!strcasecmp(var+offset, "unmerged"))
		return WT_STATUS_UNMERGED;
J
Jeff King 已提交
1115
	return -1;
1116 1117 1118 1119 1120 1121
}

static int git_status_config(const char *k, const char *v, void *cb)
{
	struct wt_status *s = cb;

N
Nguyễn Thái Ngọc Duy 已提交
1122
	if (!prefixcmp(k, "column."))
J
Jeff King 已提交
1123
		return git_column_config(k, v, "status", &s->colopts);
1124 1125 1126 1127 1128 1129 1130 1131
	if (!strcmp(k, "status.submodulesummary")) {
		int is_bool;
		s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
		if (is_bool && s->submodule_summary)
			s->submodule_summary = -1;
		return 0;
	}
	if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1132
		s->use_color = git_config_colorbool(k, v);
1133 1134 1135 1136
		return 0;
	}
	if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
		int slot = parse_status_slot(k, 13);
J
Jeff King 已提交
1137 1138
		if (slot < 0)
			return 0;
1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157
		if (!v)
			return config_error_nonbool(k);
		color_parse(v, k, s->color_palette[slot]);
		return 0;
	}
	if (!strcmp(k, "status.relativepaths")) {
		s->relative_paths = git_config_bool(k, v);
		return 0;
	}
	if (!strcmp(k, "status.showuntrackedfiles")) {
		if (!v)
			return config_error_nonbool(k);
		else if (!strcmp(v, "no"))
			s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
		else if (!strcmp(v, "normal"))
			s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
		else if (!strcmp(v, "all"))
			s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
		else
1158
			return error(_("Invalid untracked files mode '%s'"), v);
1159 1160 1161 1162 1163
		return 0;
	}
	return git_diff_ui_config(k, v, NULL);
}

J
Junio C Hamano 已提交
1164 1165
int cmd_status(int argc, const char **argv, const char *prefix)
{
J
Jeff King 已提交
1166
	static struct wt_status s;
1167
	int fd;
1168
	unsigned char sha1[20];
1169
	static struct option builtin_status_options[] = {
1170
		OPT__VERBOSE(&verbose, "be verbose"),
1171 1172
		OPT_SET_INT('s', "short", &status_format,
			    "show status concisely", STATUS_FORMAT_SHORT),
1173
		OPT_BOOLEAN('b', "branch", &s.show_branch,
1174
			    "show branch information"),
1175
		OPT_SET_INT(0, "porcelain", &status_format,
1176
			    "machine-readable output",
1177
			    STATUS_FORMAT_PORCELAIN),
1178
		OPT_BOOLEAN('z', "null", &s.null_termination,
1179
			    "terminate entries with NUL"),
1180 1181 1182 1183
		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
		  "mode",
		  "show untracked files, optional modes: all, normal, no. (Default: all)",
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1184 1185
		OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
			    "show ignored files"),
1186 1187 1188
		{ OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when",
		  "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)",
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
J
Jeff King 已提交
1189
		OPT_COLUMN(0, "column", &s.colopts, "list untracked files in columns"),
1190 1191 1192
		OPT_END(),
	};

1193 1194 1195
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_status_usage, builtin_status_options);

1196
	wt_status_prepare(&s);
1197
	gitmodules_config();
1198
	git_config(git_status_config, &s);
1199
	determine_whence(&s);
1200
	argc = parse_options(argc, argv, prefix,
1201 1202
			     builtin_status_options,
			     builtin_status_usage, 0);
J
Jeff King 已提交
1203
	finalize_colopts(&s.colopts, -1);
1204

1205
	if (s.null_termination && status_format == STATUS_FORMAT_LONG)
1206 1207
		status_format = STATUS_FORMAT_PORCELAIN;

1208
	handle_untracked_files_arg(&s);
1209 1210
	if (show_ignored_in_status)
		s.show_ignored_files = 1;
1211 1212 1213
	if (*argv)
		s.pathspec = get_pathspec(prefix, argv);

1214
	read_cache_preload(s.pathspec);
1215
	refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);
1216 1217

	fd = hold_locked_index(&index_lock, 0);
1218 1219
	if (0 <= fd)
		update_index_if_able(&the_index, &index_lock);
1220

1221
	s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1222
	s.ignore_submodule_arg = ignore_submodule_arg;
1223 1224
	wt_status_collect(&s);

J
Jeff King 已提交
1225 1226
	if (s.relative_paths)
		s.prefix = prefix;
1227

1228 1229
	switch (status_format) {
	case STATUS_FORMAT_SHORT:
1230
		wt_shortstatus_print(&s);
1231
		break;
1232
	case STATUS_FORMAT_PORCELAIN:
1233
		wt_porcelain_print(&s);
1234
		break;
1235
	case STATUS_FORMAT_LONG:
1236
		s.verbose = verbose;
1237
		s.ignore_submodule_arg = ignore_submodule_arg;
1238
		wt_status_print(&s);
1239
		break;
1240
	}
1241
	return 0;
K
Kristian Høgsberg 已提交
1242 1243
}

1244 1245
static void print_summary(const char *prefix, const unsigned char *sha1,
			  int initial_commit)
K
Kristian Høgsberg 已提交
1246 1247 1248
{
	struct rev_info rev;
	struct commit *commit;
1249
	struct strbuf format = STRBUF_INIT;
J
Jeff King 已提交
1250
	unsigned char junk_sha1[20];
1251
	const char *head;
1252 1253 1254
	struct pretty_print_context pctx = {0};
	struct strbuf author_ident = STRBUF_INIT;
	struct strbuf committer_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1255 1256 1257

	commit = lookup_commit(sha1);
	if (!commit)
1258
		die(_("couldn't look up newly created commit"));
K
Kristian Høgsberg 已提交
1259
	if (!commit || parse_commit(commit))
1260
		die(_("could not parse newly created commit"));
K
Kristian Høgsberg 已提交
1261

1262 1263 1264 1265 1266 1267 1268 1269
	strbuf_addstr(&format, "format:%h] %s");

	format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
	format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
	if (strbuf_cmp(&author_ident, &committer_ident)) {
		strbuf_addstr(&format, "\n Author: ");
		strbuf_addbuf_percentquote(&format, &author_ident);
	}
1270
	if (!user_ident_sufficiently_given()) {
1271 1272
		strbuf_addstr(&format, "\n Committer: ");
		strbuf_addbuf_percentquote(&format, &committer_ident);
1273 1274
		if (advice_implicit_identity) {
			strbuf_addch(&format, '\n');
1275
			strbuf_addstr(&format, _(implicit_ident_advice));
1276
		}
1277 1278 1279 1280
	}
	strbuf_release(&author_ident);
	strbuf_release(&committer_ident);

K
Kristian Høgsberg 已提交
1281 1282 1283 1284 1285 1286 1287 1288 1289
	init_revisions(&rev, prefix);
	setup_revisions(0, NULL, &rev, NULL);

	rev.diff = 1;
	rev.diffopt.output_format =
		DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;

	rev.verbose_header = 1;
	rev.show_root_diff = 1;
1290
	get_commit_format(format.buf, &rev);
1291
	rev.always_show_header = 0;
1292 1293
	rev.diffopt.detect_rename = 1;
	rev.diffopt.break_opt = 0;
1294
	diff_setup_done(&rev.diffopt);
K
Kristian Høgsberg 已提交
1295

1296
	head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1297
	printf("[%s%s ",
J
Jeff King 已提交
1298 1299 1300
		!prefixcmp(head, "refs/heads/") ?
			head + 11 :
			!strcmp(head, "HEAD") ?
1301
				_("detached HEAD") :
J
Jeff King 已提交
1302
				head,
1303
		initial_commit ? _(" (root-commit)") : "");
K
Kristian Høgsberg 已提交
1304

1305
	if (!log_tree_commit(&rev, commit)) {
1306 1307 1308
		rev.always_show_header = 1;
		rev.use_terminator = 1;
		log_tree_commit(&rev, commit);
1309
	}
1310

1311
	strbuf_release(&format);
K
Kristian Høgsberg 已提交
1312 1313
}

1314
static int git_commit_config(const char *k, const char *v, void *cb)
K
Kristian Høgsberg 已提交
1315
{
1316
	struct wt_status *s = cb;
J
Junio C Hamano 已提交
1317
	int status;
1318

1319
	if (!strcmp(k, "commit.template"))
1320
		return git_config_pathname(&template_file, k, v);
1321 1322 1323 1324
	if (!strcmp(k, "commit.status")) {
		include_status = git_config_bool(k, v);
		return 0;
	}
K
Kristian Høgsberg 已提交
1325

J
Junio C Hamano 已提交
1326 1327 1328
	status = git_gpg_config(k, v, NULL);
	if (status)
		return status;
1329
	return git_status_config(k, v, s);
K
Kristian Høgsberg 已提交
1330 1331
}

1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365
static const char post_rewrite_hook[] = "hooks/post-rewrite";

static int run_rewrite_hook(const unsigned char *oldsha1,
			    const unsigned char *newsha1)
{
	/* oldsha1 SP newsha1 LF NUL */
	static char buf[2*40 + 3];
	struct child_process proc;
	const char *argv[3];
	int code;
	size_t n;

	if (access(git_path(post_rewrite_hook), X_OK) < 0)
		return 0;

	argv[0] = git_path(post_rewrite_hook);
	argv[1] = "amend";
	argv[2] = NULL;

	memset(&proc, 0, sizeof(proc));
	proc.argv = argv;
	proc.in = -1;
	proc.stdout_to_stderr = 1;

	code = start_command(&proc);
	if (code)
		return code;
	n = snprintf(buf, sizeof(buf), "%s %s\n",
		     sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
	write_in_full(proc.in, buf, n);
	close(proc.in);
	return finish_command(&proc);
}

K
Kristian Høgsberg 已提交
1366 1367
int cmd_commit(int argc, const char **argv, const char *prefix)
{
J
Jeff King 已提交
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401
	static struct wt_status s;
	static struct option builtin_commit_options[] = {
		OPT__QUIET(&quiet, "suppress summary after successful commit"),
		OPT__VERBOSE(&verbose, "show diff in commit message template"),

		OPT_GROUP("Commit message options"),
		OPT_FILENAME('F', "file", &logfile, "read message from file"),
		OPT_STRING(0, "author", &force_author, "author", "override author for commit"),
		OPT_STRING(0, "date", &force_date, "date", "override date for commit"),
		OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m),
		OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"),
		OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"),
		OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"),
		OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"),
		OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C/-c/--amend)"),
		OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
		OPT_FILENAME('t', "template", &template_file, "use specified template file"),
		OPT_BOOL('e', "edit", &edit_flag, "force edit of commit"),
		OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
		OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
		{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id",
		  "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
		/* end commit message options */

		OPT_GROUP("Commit contents options"),
		OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
		OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
		OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
		OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"),
		OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
		OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
		OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
		OPT_SET_INT(0, "short", &status_format, "show status concisely",
			    STATUS_FORMAT_SHORT),
1402
		OPT_BOOLEAN(0, "branch", &s.show_branch, "show branch information"),
J
Jeff King 已提交
1403 1404
		OPT_SET_INT(0, "porcelain", &status_format,
			    "machine-readable output", STATUS_FORMAT_PORCELAIN),
1405
		OPT_BOOLEAN('z', "null", &s.null_termination,
J
Jeff King 已提交
1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
			    "terminate entries with NUL"),
		OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
		OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
		/* end commit contents options */

		{ OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
		  "ok to record an empty change",
		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
		{ OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
		  "ok to record a change with an empty message",
		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },

		OPT_END()
	};

1422
	struct strbuf sb = STRBUF_INIT;
1423
	struct strbuf author_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1424
	const char *index_file, *reflog_msg;
1425
	char *nl, *p;
1426
	unsigned char sha1[20];
K
Kristian Høgsberg 已提交
1427
	struct ref_lock *ref_lock;
M
Miklos Vajna 已提交
1428
	struct commit_list *parents = NULL, **pptr = &parents;
1429 1430
	struct stat statbuf;
	int allow_fast_forward = 1;
1431
	struct commit *current_head = NULL;
1432
	struct commit_extra_header *extra = NULL;
K
Kristian Høgsberg 已提交
1433

1434 1435 1436
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_commit_usage, builtin_commit_options);

1437 1438
	wt_status_prepare(&s);
	git_config(git_commit_config, &s);
1439
	determine_whence(&s);
J
Jeff King 已提交
1440
	s.colopts = 0;
K
Kristian Høgsberg 已提交
1441

1442 1443 1444
	if (get_sha1("HEAD", sha1))
		current_head = NULL;
	else {
1445
		current_head = lookup_commit_or_die(sha1, "HEAD");
1446 1447 1448
		if (!current_head || parse_commit(current_head))
			die(_("could not parse HEAD commit"));
	}
J
Jeff King 已提交
1449 1450
	argc = parse_and_validate_options(argc, argv, builtin_commit_options,
					  builtin_commit_usage,
1451
					  prefix, current_head, &s);
1452
	if (dry_run)
1453 1454
		return dry_run_commit(argc, argv, prefix, current_head, &s);
	index_file = prepare_index(argc, argv, prefix, current_head, 0);
K
Kristian Høgsberg 已提交
1455

1456 1457
	/* Set up everything for writing the commit object.  This includes
	   running hooks, writing the trees, and interacting with the user.  */
1458 1459
	if (!prepare_to_commit(index_file, prefix,
			       current_head, &s, &author_ident)) {
1460
		rollback_index_files();
K
Kristian Høgsberg 已提交
1461 1462 1463 1464
		return 1;
	}

	/* Determine parents */
1465
	reflog_msg = getenv("GIT_REFLOG_ACTION");
1466
	if (!current_head) {
1467 1468
		if (!reflog_msg)
			reflog_msg = "commit (initial)";
K
Kristian Høgsberg 已提交
1469 1470 1471
	} else if (amend) {
		struct commit_list *c;

1472 1473
		if (!reflog_msg)
			reflog_msg = "commit (amend)";
1474
		for (c = current_head->parents; c; c = c->next)
M
Miklos Vajna 已提交
1475
			pptr = &commit_list_insert(c->item, pptr)->next;
1476
	} else if (whence == FROM_MERGE) {
1477
		struct strbuf m = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1478 1479
		FILE *fp;

1480 1481
		if (!reflog_msg)
			reflog_msg = "commit (merge)";
1482
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1483 1484
		fp = fopen(git_path("MERGE_HEAD"), "r");
		if (fp == NULL)
1485
			die_errno(_("could not open '%s' for reading"),
1486
				  git_path("MERGE_HEAD"));
1487
		while (strbuf_getline(&m, fp, '\n') != EOF) {
1488 1489 1490 1491
			struct commit *parent;

			parent = get_merge_parent(m.buf);
			if (!parent)
1492
				die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1493
			pptr = &commit_list_insert(parent, pptr)->next;
1494
		}
K
Kristian Høgsberg 已提交
1495 1496
		fclose(fp);
		strbuf_release(&m);
1497 1498
		if (!stat(git_path("MERGE_MODE"), &statbuf)) {
			if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1499
				die_errno(_("could not read MERGE_MODE"));
1500 1501 1502 1503 1504
			if (!strcmp(sb.buf, "no-ff"))
				allow_fast_forward = 0;
		}
		if (allow_fast_forward)
			parents = reduce_heads(parents);
K
Kristian Høgsberg 已提交
1505
	} else {
1506
		if (!reflog_msg)
1507 1508 1509
			reflog_msg = (whence == FROM_CHERRY_PICK)
					? "commit (cherry-pick)"
					: "commit";
1510
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1511 1512
	}

1513
	/* Finally, get the commit message */
1514
	strbuf_reset(&sb);
1515
	if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1516
		int saved_errno = errno;
1517
		rollback_index_files();
1518
		die(_("could not read commit message: %s"), strerror(saved_errno));
1519
	}
1520 1521

	/* Truncate the message just before the diff, if any. */
1522 1523 1524 1525 1526
	if (verbose) {
		p = strstr(sb.buf, "\ndiff --git ");
		if (p != NULL)
			strbuf_setlen(&sb, p - sb.buf + 1);
	}
1527

1528 1529
	if (cleanup_mode != CLEANUP_NONE)
		stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1530 1531 1532 1533 1534
	if (template_untouched(&sb) && !allow_empty_message) {
		rollback_index_files();
		fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
		exit(1);
	}
1535
	if (message_is_empty(&sb) && !allow_empty_message) {
1536
		rollback_index_files();
1537
		fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
J
Jeff King 已提交
1538
		exit(1);
1539
	}
K
Kristian Høgsberg 已提交
1540

1541
	if (amend) {
1542 1543
		const char *exclude_gpgsig[2] = { "gpgsig", NULL };
		extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1544 1545 1546 1547
	} else {
		struct commit_extra_header **tail = &extra;
		append_merge_tag_headers(parents, &tail);
	}
1548

1549
	if (commit_tree_extended(&sb, active_cache_tree->sha1, parents, sha1,
J
Junio C Hamano 已提交
1550
				 author_ident.buf, sign_commit, extra)) {
1551
		rollback_index_files();
1552
		die(_("failed to write commit object"));
1553
	}
1554
	strbuf_release(&author_ident);
1555
	free_commit_extra_headers(extra);
K
Kristian Høgsberg 已提交
1556 1557

	ref_lock = lock_any_ref_for_update("HEAD",
1558 1559 1560
					   !current_head
					   ? NULL
					   : current_head->object.sha1,
K
Kristian Høgsberg 已提交
1561 1562
					   0);

M
Miklos Vajna 已提交
1563
	nl = strchr(sb.buf, '\n');
1564 1565 1566 1567 1568 1569
	if (nl)
		strbuf_setlen(&sb, nl + 1 - sb.buf);
	else
		strbuf_addch(&sb, '\n');
	strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
	strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
K
Kristian Høgsberg 已提交
1570

1571 1572
	if (!ref_lock) {
		rollback_index_files();
1573
		die(_("cannot lock HEAD ref"));
1574
	}
1575
	if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1576
		rollback_index_files();
1577
		die(_("cannot update HEAD ref"));
1578
	}
K
Kristian Høgsberg 已提交
1579

J
Jay Soffian 已提交
1580
	unlink(git_path("CHERRY_PICK_HEAD"));
1581
	unlink(git_path("REVERT_HEAD"));
K
Kristian Høgsberg 已提交
1582 1583
	unlink(git_path("MERGE_HEAD"));
	unlink(git_path("MERGE_MSG"));
1584
	unlink(git_path("MERGE_MODE"));
1585
	unlink(git_path("SQUASH_MSG"));
K
Kristian Høgsberg 已提交
1586

1587
	if (commit_index_files())
1588
		die (_("Repository has been updated, but unable to write\n"
1589
		     "new_index file. Check that disk is not full or quota is\n"
1590
		     "not exceeded, and then \"git reset HEAD\" to recover."));
K
Kristian Høgsberg 已提交
1591

1592
	rerere(0);
1593
	run_hook(get_index_file(), "post-commit", NULL);
1594
	if (amend && !no_post_rewrite) {
1595 1596 1597
		struct notes_rewrite_cfg *cfg;
		cfg = init_copy_notes_for_rewrite("amend");
		if (cfg) {
1598 1599
			/* we are amending, so current_head is not NULL */
			copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1600 1601
			finish_copy_notes_for_rewrite(cfg);
		}
1602
		run_rewrite_hook(current_head->object.sha1, sha1);
1603
	}
K
Kristian Høgsberg 已提交
1604
	if (!quiet)
1605
		print_summary(prefix, sha1, !current_head);
K
Kristian Høgsberg 已提交
1606 1607 1608

	return 0;
}