commit.c 47.1 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"
31
#include "sequencer.h"
32
#include "notes-utils.h"
K
Kristian Høgsberg 已提交
33 34

static const char * const builtin_commit_usage[] = {
35
	N_("git commit [options] [--] <pathspec>..."),
K
Kristian Høgsberg 已提交
36 37 38
	NULL
};

39
static const char * const builtin_status_usage[] = {
40
	N_("git status [options] [--] <pathspec>..."),
41 42 43
	NULL
};

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

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

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

static const char *use_message_buffer;
K
Kristian Høgsberg 已提交
70
static const char commit_editmsg[] = "COMMIT_EDITMSG";
71 72 73 74 75
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,
76
	COMMIT_PARTIAL
77
} commit_style;
K
Kristian Høgsberg 已提交
78

79
static const char *logfile, *force_author;
80
static const char *template_file;
81 82 83 84 85
/*
 * 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 已提交
86
static char *edit_message, *use_message;
87
static char *fixup_message, *squash_message;
J
Junio C Hamano 已提交
88 89
static int all, also, interactive, patch_interactive, only, amend, signoff;
static int edit_flag = -1; /* unspecified */
90
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
91
static int no_post_rewrite, allow_empty_message;
92
static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
J
Junio C Hamano 已提交
93 94
static char *sign_commit;

95 96 97 98 99 100 101 102 103 104
/*
 * 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,
105
	CLEANUP_ALL
106
} cleanup_mode;
107
static const char *cleanup_arg;
K
Kristian Høgsberg 已提交
108

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

115
static enum status_format {
116
	STATUS_FORMAT_NONE = 0,
117 118
	STATUS_FORMAT_LONG,
	STATUS_FORMAT_SHORT,
119 120 121 122
	STATUS_FORMAT_PORCELAIN,

	STATUS_FORMAT_UNSPECIFIED
} status_format = STATUS_FORMAT_UNSPECIFIED;
123

124 125 126
static int opt_parse_m(const struct option *opt, const char *arg, int unset)
{
	struct strbuf *buf = opt->value;
127 128
	if (unset) {
		have_option_m = 0;
129
		strbuf_setlen(buf, 0);
130 131
	} else {
		have_option_m = 1;
132 133
		if (buf->len)
			strbuf_addch(buf, '\n');
134
		strbuf_addstr(buf, arg);
135
		strbuf_complete_line(buf);
136 137 138
	}
	return 0;
}
K
Kristian Høgsberg 已提交
139

140 141 142 143 144 145 146 147 148 149 150 151
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;
}

152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
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;
	}
}

167
static int commit_index_files(void)
168
{
169 170
	int err = 0;

171 172 173 174
	switch (commit_style) {
	case COMMIT_AS_IS:
		break; /* nothing to do */
	case COMMIT_NORMAL:
175
		err = commit_lock_file(&index_lock);
176 177
		break;
	case COMMIT_PARTIAL:
178
		err = commit_lock_file(&index_lock);
179 180 181
		rollback_lock_file(&false_lock);
		break;
	}
182 183

	return err;
184 185 186 187 188 189
}

/*
 * 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.
 */
190
static int list_paths(struct string_list *list, const char *with_tree,
191 192 193 194 195
		      const char *prefix, const char **pattern)
{
	int i;
	char *m;

196 197 198
	if (!pattern)
		return 0;

199 200 201 202
	for (i = 0; pattern[i]; i++)
		;
	m = xcalloc(1, i);

203
	if (with_tree) {
204
		char *max_prefix = common_prefix(pattern);
205 206
		overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
		free(max_prefix);
207
	}
208 209

	for (i = 0; i < active_nr; i++) {
210
		const struct cache_entry *ce = active_cache[i];
211 212
		struct string_list_item *item;

213
		if (ce->ce_flags & CE_UPDATE)
214
			continue;
215
		if (!match_pathspec(pattern, ce->name, ce_namelen(ce), 0, m))
216
			continue;
217
		item = string_list_insert(list, ce->name);
218 219
		if (ce_skip_worktree(ce))
			item->util = item; /* better a valid pointer than a fake one */
220 221
	}

222
	return report_path_error(m, pattern, prefix);
223 224
}

225
static void add_remove_files(struct string_list *list)
226 227 228
{
	int i;
	for (i = 0; i < list->nr; i++) {
229
		struct stat st;
230
		struct string_list_item *p = &(list->items[i]);
231

232 233
		/* p->util is skip-worktree */
		if (p->util)
234
			continue;
235

236 237
		if (!lstat(p->string, &st)) {
			if (add_to_cache(p->string, &st, 0))
238
				die(_("updating files failed"));
239
		} else
240
			remove_file_from_cache(p->string);
241 242 243
	}
}

244
static void create_base_index(const struct commit *current_head)
245 246 247 248 249
{
	struct tree *tree;
	struct unpack_trees_options opts;
	struct tree_desc t;

250
	if (!current_head) {
251 252 253 254 255 256 257 258
		discard_cache();
		return;
	}

	memset(&opts, 0, sizeof(opts));
	opts.head_idx = 1;
	opts.index_only = 1;
	opts.merge = 1;
259 260
	opts.src_index = &the_index;
	opts.dst_index = &the_index;
261 262

	opts.fn = oneway_merge;
263
	tree = parse_tree_indirect(current_head->object.sha1);
264
	if (!tree)
265
		die(_("failed to unpack HEAD tree object"));
266 267
	parse_tree(tree);
	init_tree_desc(&t, tree->buffer, tree->size);
268 269
	if (unpack_trees(1, &t, &opts))
		exit(128); /* We've already reported the error, finish dying */
270 271
}

272 273 274 275 276 277 278 279 280 281
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");
}

282 283
static char *prepare_index(int argc, const char **argv, const char *prefix,
			   const struct commit *current_head, int is_status)
K
Kristian Høgsberg 已提交
284 285
{
	int fd;
286
	struct string_list partial;
287
	const char **pathspec = NULL;
288
	char *old_index_env = NULL;
289
	int refresh_flags = REFRESH_QUIET;
K
Kristian Høgsberg 已提交
290

291 292
	if (is_status)
		refresh_flags |= REFRESH_UNMERGED;
K
Kristian Høgsberg 已提交
293

294 295
	if (*argv)
		pathspec = get_pathspec(prefix, argv);
296

L
Linus Torvalds 已提交
297
	if (read_cache_preload(pathspec) < 0)
298
		die(_("index file corrupt"));
L
Linus Torvalds 已提交
299

300 301 302 303 304 305 306 307 308 309 310 311
	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);

312
		if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
313 314 315 316 317 318 319 320 321 322 323 324 325 326
			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;
	}

327 328 329 330 331 332 333 334 335 336 337 338 339
	/*
	 * 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)) {
340
		fd = hold_locked_index(&index_lock, 1);
341
		add_files_to_cache(also ? prefix : NULL, pathspec, 0);
342
		refresh_cache_or_die(refresh_flags);
343
		update_main_cache_tree(WRITE_TREE_SILENT);
B
Brandon Casey 已提交
344 345
		if (write_cache(fd, active_cache, active_nr) ||
		    close_lock_file(&index_lock))
346
			die(_("unable to write new_index file"));
347 348
		commit_style = COMMIT_NORMAL;
		return index_lock.filename;
K
Kristian Høgsberg 已提交
349 350
	}

351 352 353 354 355
	/*
	 * As-is commit.
	 *
	 * (1) return the name of the real index file.
	 *
356 357
	 * The caller should run hooks on the real index,
	 * and create commit from the_index.
358 359
	 * We still need to refresh the index here.
	 */
360
	if (!only && (!pathspec || !*pathspec)) {
361
		fd = hold_locked_index(&index_lock, 1);
362
		refresh_cache_or_die(refresh_flags);
363
		if (active_cache_changed) {
364
			update_main_cache_tree(WRITE_TREE_SILENT);
365 366
			if (write_cache(fd, active_cache, active_nr) ||
			    commit_locked_index(&index_lock))
367
				die(_("unable to write new_index file"));
368 369 370
		} else {
			rollback_lock_file(&index_lock);
		}
371
		commit_style = COMMIT_AS_IS;
K
Kristian Høgsberg 已提交
372 373 374
		return get_index_file();
	}

375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
	/*
	 * 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;

396 397 398 399 400 401
	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."));
	}
402 403

	memset(&partial, 0, sizeof(partial));
404
	partial.strdup_strings = 1;
405
	if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec))
406 407 408 409
		exit(1);

	discard_cache();
	if (read_cache() < 0)
410
		die(_("cannot read the index"));
411 412 413

	fd = hold_locked_index(&index_lock, 1);
	add_remove_files(&partial);
414
	refresh_cache(REFRESH_QUIET);
B
Brandon Casey 已提交
415 416
	if (write_cache(fd, active_cache, active_nr) ||
	    close_lock_file(&index_lock))
417
		die(_("unable to write new_index file"));
K
Kristian Høgsberg 已提交
418

419
	fd = hold_lock_file_for_update(&false_lock,
J
Junio C Hamano 已提交
420 421
				       git_path("next-index-%"PRIuMAX,
						(uintmax_t) getpid()),
422
				       LOCK_DIE_ON_ERROR);
423

424
	create_base_index(current_head);
425
	add_remove_files(&partial);
426
	refresh_cache(REFRESH_QUIET);
K
Kristian Høgsberg 已提交
427

B
Brandon Casey 已提交
428 429
	if (write_cache(fd, active_cache, active_nr) ||
	    close_lock_file(&false_lock))
430
		die(_("unable to write temporary index file"));
431 432 433 434

	discard_cache();
	read_cache_from(false_lock.filename);

435
	return false_lock.filename;
K
Kristian Høgsberg 已提交
436 437
}

438 439
static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
		      struct wt_status *s)
K
Kristian Høgsberg 已提交
440
{
441 442
	unsigned char sha1[20];

443 444
	if (s->relative_paths)
		s->prefix = prefix;
K
Kristian Høgsberg 已提交
445 446

	if (amend) {
447 448
		s->amend = 1;
		s->reference = "HEAD^1";
K
Kristian Høgsberg 已提交
449
	}
450 451 452 453
	s->verbose = verbose;
	s->index_file = index_file;
	s->fp = fp;
	s->nowarn = nowarn;
454
	s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
K
Kristian Høgsberg 已提交
455

456
	wt_status_collect(s);
457 458 459

	switch (status_format) {
	case STATUS_FORMAT_SHORT:
460
		wt_shortstatus_print(s);
461 462
		break;
	case STATUS_FORMAT_PORCELAIN:
463
		wt_porcelain_print(s);
464
		break;
465 466 467
	case STATUS_FORMAT_UNSPECIFIED:
		die("BUG: finalize_deferred_config() should have been called");
		break;
468
	case STATUS_FORMAT_NONE:
469 470 471 472
	case STATUS_FORMAT_LONG:
		wt_status_print(s);
		break;
	}
K
Kristian Høgsberg 已提交
473

474
	return s->commitable;
K
Kristian Høgsberg 已提交
475 476
}

477
static int is_a_merge(const struct commit *current_head)
478
{
479
	return !!(current_head->parents && current_head->parents->next);
480 481
}

482 483 484 485 486 487 488 489 490 491
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);
}

492 493 494 495 496 497 498 499 500 501 502 503 504 505
static int sane_ident_split(struct ident_split *person)
{
	if (!person->name_begin || !person->name_end ||
	    person->name_begin == person->name_end)
		return 0; /* no human readable name */
	if (!person->mail_begin || !person->mail_end ||
	    person->mail_begin == person->mail_end)
		return 0; /* no usable mail */
	if (!person->date_begin || !person->date_end ||
	    !person->tz_begin || !person->tz_end)
		return 0;
	return 1;
}

506
static void determine_author_info(struct strbuf *author_ident)
507 508
{
	char *name, *email, *date;
509
	struct ident_split author;
510 511 512 513 514

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

515
	if (author_message) {
516
		const char *a, *lb, *rb, *eol;
517
		size_t len;
518

519
		a = strstr(author_message_buffer, "\nauthor ");
520
		if (!a)
J
Junio C Hamano 已提交
521
			die(_("invalid commit: %s"), author_message);
522

523 524 525 526
		lb = strchrnul(a + strlen("\nauthor "), '<');
		rb = strchrnul(lb, '>');
		eol = strchrnul(rb, '\n');
		if (!*lb || !*rb || !*eol)
J
Junio C Hamano 已提交
527
			die(_("invalid commit: %s"), author_message);
528

529 530 531 532 533 534 535 536
		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("<")));
537 538 539 540 541
		len = eol - (rb + strlen("> "));
		date = xmalloc(len + 2);
		*date = '@';
		memcpy(date + 1, rb + strlen("> "), len);
		date[len + 1] = '\0';
542 543 544 545 546 547 548
	}

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

		if (!lb || !rb)
549
			die(_("malformed --author parameter"));
550 551 552 553
		name = xstrndup(force_author, lb - force_author);
		email = xstrndup(lb + 2, rb - (lb + 2));
	}

M
Miklos Vajna 已提交
554 555
	if (force_date)
		date = force_date;
556
	strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
557 558
	if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
	    sane_ident_split(&author)) {
559 560 561 562
		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, '@');
	}
563 564
}

565 566 567 568
static char *cut_ident_timestamp_part(char *string)
{
	char *ket = strrchr(string, '>');
	if (!ket || ket[1] != ' ')
569
		die(_("Malformed ident string: '%s'"), string);
570 571 572 573
	*++ket = '\0';
	return ket;
}

574
static int prepare_to_commit(const char *index_file, const char *prefix,
575
			     struct commit *current_head,
576 577
			     struct wt_status *s,
			     struct strbuf *author_ident)
K
Kristian Høgsberg 已提交
578 579
{
	struct stat statbuf;
580
	struct strbuf committer_ident = STRBUF_INIT;
581
	int commitable, saved_color_setting;
582
	struct strbuf sb = STRBUF_INIT;
K
Kristian Høgsberg 已提交
583
	char *buffer;
584 585
	const char *hook_arg1 = NULL;
	const char *hook_arg2 = NULL;
586
	int ident_shown = 0;
587
	int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
K
Kristian Høgsberg 已提交
588

589 590 591
	/* This checks and barfs if author is badly specified */
	determine_author_info(author_ident);

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

595 596 597 598 599 600 601 602 603 604 605 606
	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)
607
				die(_("could not lookup commit %s"), squash_message);
608 609 610 611 612 613
			ctx.output_encoding = get_commit_output_encoding();
			format_commit_message(c, "squash! %s\n\n", &sb,
					      &ctx);
		}
	}

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

660
	/*
661 662
	 * The remaining cases don't modify the template message, but
	 * just set the argument(s) to the prepare-commit-msg hook.
663
	 */
664
	else if (whence == FROM_MERGE)
665
		hook_arg1 = "merge";
666 667 668 669
	else if (whence == FROM_CHERRY_PICK) {
		hook_arg1 = "commit";
		hook_arg2 = "CHERRY_PICK_HEAD";
	}
670

671 672 673 674 675 676 677 678 679 680
	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 = "";
	}

681 682
	s->fp = fopen(git_path(commit_editmsg), "w");
	if (s->fp == NULL)
683
		die_errno(_("could not open '%s'"), git_path(commit_editmsg));
K
Kristian Høgsberg 已提交
684

685
	if (clean_message_contents)
686
		stripspace(&sb, 0);
K
Kristian Høgsberg 已提交
687 688

	if (signoff) {
689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
		/*
		 * See if we have a Conflicts: block at the end. If yes, count
		 * its size, so we can ignore it.
		 */
		int ignore_footer = 0;
		int i, eol, previous = 0;
		const char *nl;

		for (i = 0; i < sb.len; i++) {
			nl = memchr(sb.buf + i, '\n', sb.len - i);
			if (nl)
				eol = nl - sb.buf;
			else
				eol = sb.len;
			if (!prefixcmp(sb.buf + previous, "\nConflicts:\n")) {
				ignore_footer = sb.len - previous;
				break;
			}
			while (i < eol)
				i++;
			previous = eol;
710
		}
711

712
		append_signoff(&sb, ignore_footer, 0);
K
Kristian Høgsberg 已提交
713 714
	}

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

K
Kristian Høgsberg 已提交
718 719
	strbuf_release(&sb);

720
	/* This checks if committer ident is explicitly given */
721
	strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
722
	if (use_editor && include_status) {
723
		char *ai_tmp, *ci_tmp;
724
		if (whence != FROM_COMMIT)
725
			status_printf_ln(s, GIT_COLOR_NORMAL,
726 727 728 729 730 731 732 733 734 735 736
			    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"),
737 738 739
				git_path(whence == FROM_MERGE
					 ? "MERGE_HEAD"
					 : "CHERRY_PICK_HEAD"));
740

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

758 759 760
		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))
761
			status_printf_ln(s, GIT_COLOR_NORMAL,
762 763
				_("%s"
				"Author:    %s"),
764
				ident_shown++ ? "" : "\n",
765
				author_ident->buf);
766

767
		if (!committer_ident_sufficiently_given())
768
			status_printf_ln(s, GIT_COLOR_NORMAL,
769 770
				_("%s"
				"Committer: %s"),
771
				ident_shown++ ? "" : "\n",
772
				committer_ident.buf);
773 774

		if (ident_shown)
775
			status_printf_ln(s, GIT_COLOR_NORMAL, "");
776

777 778
		saved_color_setting = s->use_color;
		s->use_color = 0;
779
		commitable = run_status(s->fp, index_file, prefix, 1, s);
780
		s->use_color = saved_color_setting;
781 782 783

		*ai_tmp = ' ';
		*ci_tmp = ' ';
784
	} else {
785
		unsigned char sha1[20];
786
		const char *parent = "HEAD";
787 788

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

791 792 793
		if (amend)
			parent = "HEAD^1";

794
		if (get_sha1(parent, sha1))
795
			commitable = !!active_nr;
796 797
		else
			commitable = index_differs_from(parent, 0);
798
	}
799
	strbuf_release(&committer_ident);
800

801
	fclose(s->fp);
802

803 804 805 806 807 808
	/*
	 * 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 &&
809
	    !(amend && is_a_merge(current_head))) {
810
		run_status(stdout, index_file, prefix, 0, s);
J
Jeff King 已提交
811
		if (amend)
812
			fputs(_(empty_amend_advice), stderr);
813
		else if (whence == FROM_CHERRY_PICK)
J
Junio C Hamano 已提交
814
			fputs(_(empty_cherry_pick_advice), stderr);
815
		return 0;
816 817
	}

818 819 820 821 822 823 824
	/*
	 * 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);
825
	if (update_main_cache_tree(0)) {
826
		error(_("Error building trees"));
827
		return 0;
828
	}
K
Kristian Høgsberg 已提交
829

830 831 832
	if (run_hook(index_file, "prepare-commit-msg",
		     git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
		return 0;
K
Kristian Høgsberg 已提交
833

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

846 847 848 849
	if (!no_verify &&
	    run_hook(index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
		return 0;
	}
K
Kristian Høgsberg 已提交
850

851
	return 1;
K
Kristian Høgsberg 已提交
852 853
}

854
static int rest_is_empty(struct strbuf *sb, int start)
K
Kristian Høgsberg 已提交
855
{
856
	int i, eol;
K
Kristian Høgsberg 已提交
857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
	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;
}

880 881 882 883 884 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
/*
 * 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);
}

914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931
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) {
932 933
		struct pretty_print_context ctx = {0};
		ctx.date_mode = DATE_NORMAL;
934
		strbuf_release(&buf);
935
		format_commit_message(commit, "%an <%ae>", &buf, &ctx);
936 937
		return strbuf_detach(&buf, NULL);
	}
938
	die(_("No existing author found with '%s'"), name);
939 940
}

941 942 943 944 945 946 947 948 949 950 951 952

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
953
		die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
954 955
}

956 957
static const char *read_commit_message(const char *name)
{
J
Jeff King 已提交
958
	const char *out_enc;
959 960 961 962
	struct commit *commit;

	commit = lookup_commit_reference_by_name(name);
	if (!commit)
J
Junio C Hamano 已提交
963
		die(_("could not lookup commit %s"), name);
964
	out_enc = get_commit_output_encoding();
965
	return logmsg_reencode(commit, NULL, out_enc);
966 967
}

968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
/*
 * Enumerate what needs to be propagated when --porcelain
 * is not in effect here.
 */
static struct status_deferred_config {
	enum status_format status_format;
	int show_branch;
} status_deferred_config = {
	STATUS_FORMAT_UNSPECIFIED,
	-1 /* unspecified */
};

static void finalize_deferred_config(struct wt_status *s)
{
	int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
				   !s->null_termination);

	if (s->null_termination) {
		if (status_format == STATUS_FORMAT_NONE ||
		    status_format == STATUS_FORMAT_UNSPECIFIED)
			status_format = STATUS_FORMAT_PORCELAIN;
		else if (status_format == STATUS_FORMAT_LONG)
			die(_("--long and -z are incompatible"));
	}

	if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED)
		status_format = status_deferred_config.status_format;
	if (status_format == STATUS_FORMAT_UNSPECIFIED)
		status_format = STATUS_FORMAT_NONE;

	if (use_deferred_config && s->show_branch < 0)
		s->show_branch = status_deferred_config.show_branch;
	if (s->show_branch < 0)
		s->show_branch = 0;
}

1004
static int parse_and_validate_options(int argc, const char *argv[],
J
Jeff King 已提交
1005
				      const struct option *options,
1006
				      const char * const usage[],
1007
				      const char *prefix,
1008
				      struct commit *current_head,
1009
				      struct wt_status *s)
K
Kristian Høgsberg 已提交
1010 1011 1012
{
	int f = 0;

J
Jeff King 已提交
1013
	argc = parse_options(argc, argv, prefix, options, usage, 0);
1014
	finalize_deferred_config(s);
K
Kristian Høgsberg 已提交
1015

1016 1017 1018
	if (force_author && !strchr(force_author, '>'))
		force_author = find_author_by_nickname(force_author);

1019
	if (force_author && renew_authorship)
1020
		die(_("Using both --reset-author and --author does not make sense"));
1021

1022
	if (logfile || have_option_m || use_message || fixup_message)
1023
		use_editor = 0;
J
Junio C Hamano 已提交
1024 1025
	if (0 <= edit_flag)
		use_editor = edit_flag;
1026 1027
	if (!use_editor)
		setenv("GIT_EDITOR", ":", 1);
K
Kristian Høgsberg 已提交
1028 1029

	/* Sanity check options */
1030
	if (amend && !current_head)
1031
		die(_("You have nothing to amend."));
1032 1033 1034 1035 1036 1037
	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."));
	}
1038
	if (fixup_message && squash_message)
1039
		die(_("Options --squash and --fixup cannot be used together"));
K
Kristian Høgsberg 已提交
1040 1041 1042 1043
	if (use_message)
		f++;
	if (edit_message)
		f++;
1044 1045
	if (fixup_message)
		f++;
K
Kristian Høgsberg 已提交
1046 1047 1048
	if (logfile)
		f++;
	if (f > 1)
1049
		die(_("Only one of -c/-C/-F/--fixup can be used."));
1050
	if (message.len && f > 0)
1051
		die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1052 1053
	if (f || message.len)
		template_file = NULL;
K
Kristian Høgsberg 已提交
1054 1055
	if (edit_message)
		use_message = edit_message;
1056
	if (amend && !use_message && !fixup_message)
K
Kristian Høgsberg 已提交
1057
		use_message = "HEAD";
1058
	if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1059
		die(_("--reset-author can be used only with -C, -c or --amend."));
K
Kristian Høgsberg 已提交
1060
	if (use_message) {
1061 1062 1063 1064 1065 1066 1067 1068 1069
		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 已提交
1070 1071
	}

1072 1073 1074
	if (patch_interactive)
		interactive = 1;

K
Kristian Høgsberg 已提交
1075
	if (!!also + !!only + !!all + !!interactive > 1)
1076
		die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
K
Kristian Høgsberg 已提交
1077
	if (argc == 0 && (also || (only && !amend)))
1078
		die(_("No paths with --include/--only does not make sense."));
K
Kristian Høgsberg 已提交
1079
	if (argc == 0 && only && amend)
1080
		only_include_assumed = _("Clever... amending the last one with dirty index.");
1081
	if (argc > 0 && !also && !only)
1082
		only_include_assumed = _("Explicit paths specified without -i nor -o; assuming --only paths...");
1083 1084 1085 1086 1087 1088 1089 1090 1091
	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
1092
		die(_("Invalid cleanup mode %s"), cleanup_arg);
K
Kristian Høgsberg 已提交
1093

1094
	handle_untracked_files_arg(s);
1095

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

1099
	if (status_format != STATUS_FORMAT_NONE)
1100 1101
		dry_run = 1;

K
Kristian Høgsberg 已提交
1102 1103 1104
	return argc;
}

1105
static int dry_run_commit(int argc, const char **argv, const char *prefix,
1106
			  const struct commit *current_head, struct wt_status *s)
K
Kristian Høgsberg 已提交
1107 1108
{
	int commitable;
J
Junio C Hamano 已提交
1109
	const char *index_file;
K
Kristian Høgsberg 已提交
1110

1111
	index_file = prepare_index(argc, argv, prefix, current_head, 1);
1112
	commitable = run_status(stdout, index_file, prefix, 0, s);
J
Junio C Hamano 已提交
1113
	rollback_index_files();
K
Kristian Høgsberg 已提交
1114

J
Junio C Hamano 已提交
1115 1116 1117
	return commitable ? 0 : 1;
}

1118 1119 1120 1121
static int parse_status_slot(const char *var, int offset)
{
	if (!strcasecmp(var+offset, "header"))
		return WT_STATUS_HEADER;
1122 1123
	if (!strcasecmp(var+offset, "branch"))
		return WT_STATUS_ONBRANCH;
1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134
	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 已提交
1135
	return -1;
1136 1137 1138 1139 1140 1141
}

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 已提交
1142
	if (!prefixcmp(k, "column."))
J
Jeff King 已提交
1143
		return git_column_config(k, v, "status", &s->colopts);
1144 1145 1146 1147 1148 1149 1150
	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;
	}
1151 1152
	if (!strcmp(k, "status.short")) {
		if (git_config_bool(k, v))
1153
			status_deferred_config.status_format = STATUS_FORMAT_SHORT;
1154
		else
1155
			status_deferred_config.status_format = STATUS_FORMAT_NONE;
1156 1157
		return 0;
	}
1158
	if (!strcmp(k, "status.branch")) {
1159
		status_deferred_config.show_branch = git_config_bool(k, v);
1160 1161
		return 0;
	}
1162
	if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1163
		s->use_color = git_config_colorbool(k, v);
1164 1165 1166 1167
		return 0;
	}
	if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
		int slot = parse_status_slot(k, 13);
J
Jeff King 已提交
1168 1169
		if (slot < 0)
			return 0;
1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188
		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
1189
			return error(_("Invalid untracked files mode '%s'"), v);
1190 1191 1192 1193 1194
		return 0;
	}
	return git_diff_ui_config(k, v, NULL);
}

J
Junio C Hamano 已提交
1195 1196
int cmd_status(int argc, const char **argv, const char *prefix)
{
J
Jeff King 已提交
1197
	static struct wt_status s;
1198
	int fd;
1199
	unsigned char sha1[20];
1200
	static struct option builtin_status_options[] = {
1201
		OPT__VERBOSE(&verbose, N_("be verbose")),
1202
		OPT_SET_INT('s', "short", &status_format,
1203
			    N_("show status concisely"), STATUS_FORMAT_SHORT),
1204 1205
		OPT_BOOL('b', "branch", &s.show_branch,
			 N_("show branch information")),
1206
		OPT_SET_INT(0, "porcelain", &status_format,
1207
			    N_("machine-readable output"),
1208
			    STATUS_FORMAT_PORCELAIN),
1209 1210 1211
		OPT_SET_INT(0, "long", &status_format,
			    N_("show status in long format (default)"),
			    STATUS_FORMAT_LONG),
1212
		OPT_BOOLEAN('z', "null", &s.null_termination,
1213
			    N_("terminate entries with NUL")),
1214
		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1215 1216
		  N_("mode"),
		  N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
1217
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1218
		OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
1219 1220 1221
			    N_("show ignored files")),
		{ OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
		  N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
1222
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1223
		OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
1224 1225 1226
		OPT_END(),
	};

1227 1228 1229
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_status_usage, builtin_status_options);

1230
	wt_status_prepare(&s);
1231
	gitmodules_config();
1232
	git_config(git_status_config, &s);
1233
	determine_whence(&s);
1234
	argc = parse_options(argc, argv, prefix,
1235 1236
			     builtin_status_options,
			     builtin_status_usage, 0);
J
Jeff King 已提交
1237
	finalize_colopts(&s.colopts, -1);
1238
	finalize_deferred_config(&s);
1239

1240
	handle_untracked_files_arg(&s);
1241 1242
	if (show_ignored_in_status)
		s.show_ignored_files = 1;
1243 1244 1245
	if (*argv)
		s.pathspec = get_pathspec(prefix, argv);

1246
	read_cache_preload(s.pathspec);
1247
	refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);
1248 1249

	fd = hold_locked_index(&index_lock, 0);
1250 1251
	if (0 <= fd)
		update_index_if_able(&the_index, &index_lock);
1252

1253
	s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1254
	s.ignore_submodule_arg = ignore_submodule_arg;
1255 1256
	wt_status_collect(&s);

J
Jeff King 已提交
1257 1258
	if (s.relative_paths)
		s.prefix = prefix;
1259

1260 1261
	switch (status_format) {
	case STATUS_FORMAT_SHORT:
1262
		wt_shortstatus_print(&s);
1263
		break;
1264
	case STATUS_FORMAT_PORCELAIN:
1265
		wt_porcelain_print(&s);
1266
		break;
1267 1268 1269
	case STATUS_FORMAT_UNSPECIFIED:
		die("BUG: finalize_deferred_config() should have been called");
		break;
1270
	case STATUS_FORMAT_NONE:
1271
	case STATUS_FORMAT_LONG:
1272
		s.verbose = verbose;
1273
		s.ignore_submodule_arg = ignore_submodule_arg;
1274
		wt_status_print(&s);
1275
		break;
1276
	}
1277
	return 0;
K
Kristian Høgsberg 已提交
1278 1279
}

1280 1281
static void print_summary(const char *prefix, const unsigned char *sha1,
			  int initial_commit)
K
Kristian Høgsberg 已提交
1282 1283 1284
{
	struct rev_info rev;
	struct commit *commit;
1285
	struct strbuf format = STRBUF_INIT;
J
Jeff King 已提交
1286
	unsigned char junk_sha1[20];
1287
	const char *head;
1288 1289 1290
	struct pretty_print_context pctx = {0};
	struct strbuf author_ident = STRBUF_INIT;
	struct strbuf committer_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1291 1292 1293

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

1298 1299 1300 1301 1302 1303 1304 1305
	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);
	}
1306
	if (!committer_ident_sufficiently_given()) {
1307 1308
		strbuf_addstr(&format, "\n Committer: ");
		strbuf_addbuf_percentquote(&format, &committer_ident);
1309 1310
		if (advice_implicit_identity) {
			strbuf_addch(&format, '\n');
1311
			strbuf_addstr(&format, _(implicit_ident_advice));
1312
		}
1313 1314 1315 1316
	}
	strbuf_release(&author_ident);
	strbuf_release(&committer_ident);

K
Kristian Høgsberg 已提交
1317 1318 1319 1320 1321 1322 1323 1324 1325
	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;
1326
	get_commit_format(format.buf, &rev);
1327
	rev.always_show_header = 0;
1328 1329
	rev.diffopt.detect_rename = 1;
	rev.diffopt.break_opt = 0;
1330
	diff_setup_done(&rev.diffopt);
K
Kristian Høgsberg 已提交
1331

1332
	head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1333
	printf("[%s%s ",
J
Jeff King 已提交
1334 1335 1336
		!prefixcmp(head, "refs/heads/") ?
			head + 11 :
			!strcmp(head, "HEAD") ?
1337
				_("detached HEAD") :
J
Jeff King 已提交
1338
				head,
1339
		initial_commit ? _(" (root-commit)") : "");
K
Kristian Høgsberg 已提交
1340

1341
	if (!log_tree_commit(&rev, commit)) {
1342 1343 1344
		rev.always_show_header = 1;
		rev.use_terminator = 1;
		log_tree_commit(&rev, commit);
1345
	}
1346

1347
	strbuf_release(&format);
K
Kristian Høgsberg 已提交
1348 1349
}

1350
static int git_commit_config(const char *k, const char *v, void *cb)
K
Kristian Høgsberg 已提交
1351
{
1352
	struct wt_status *s = cb;
J
Junio C Hamano 已提交
1353
	int status;
1354

1355
	if (!strcmp(k, "commit.template"))
1356
		return git_config_pathname(&template_file, k, v);
1357 1358 1359 1360
	if (!strcmp(k, "commit.status")) {
		include_status = git_config_bool(k, v);
		return 0;
	}
1361 1362
	if (!strcmp(k, "commit.cleanup"))
		return git_config_string(&cleanup_arg, k, v);
K
Kristian Høgsberg 已提交
1363

J
Junio C Hamano 已提交
1364 1365 1366
	status = git_gpg_config(k, v, NULL);
	if (status)
		return status;
1367
	return git_status_config(k, v, s);
K
Kristian Høgsberg 已提交
1368 1369
}

1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
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;

1380 1381
	argv[0] = find_hook("post-rewrite");
	if (!argv[0])
1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401
		return 0;

	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 已提交
1402 1403
int cmd_commit(int argc, const char **argv, const char *prefix)
{
J
Jeff King 已提交
1404 1405
	static struct wt_status s;
	static struct option builtin_commit_options[] = {
1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425
		OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
		OPT__VERBOSE(&verbose, N_("show diff in commit message template")),

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

1428 1429 1430 1431 1432 1433 1434 1435 1436
		OPT_GROUP(N_("Commit contents options")),
		OPT_BOOLEAN('a', "all", &all, N_("commit all changed files")),
		OPT_BOOLEAN('i', "include", &also, N_("add specified files to index for commit")),
		OPT_BOOLEAN(0, "interactive", &interactive, N_("interactively add files")),
		OPT_BOOLEAN('p', "patch", &patch_interactive, N_("interactively add changes")),
		OPT_BOOLEAN('o', "only", &only, N_("commit only specified files")),
		OPT_BOOLEAN('n', "no-verify", &no_verify, N_("bypass pre-commit hook")),
		OPT_BOOLEAN(0, "dry-run", &dry_run, N_("show what would be committed")),
		OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
J
Jeff King 已提交
1437
			    STATUS_FORMAT_SHORT),
1438
		OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
J
Jeff King 已提交
1439
		OPT_SET_INT(0, "porcelain", &status_format,
1440
			    N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
1441 1442 1443
		OPT_SET_INT(0, "long", &status_format,
			    N_("show status in long format (default)"),
			    STATUS_FORMAT_LONG),
1444
		OPT_BOOLEAN('z', "null", &s.null_termination,
1445 1446 1447 1448
			    N_("terminate entries with NUL")),
		OPT_BOOLEAN(0, "amend", &amend, N_("amend previous commit")),
		OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, N_("mode"), N_("show untracked files, optional modes: all, normal, no. (Default: all)"), PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
J
Jeff King 已提交
1449 1450 1451
		/* end commit contents options */

		{ OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
1452
		  N_("ok to record an empty change"),
J
Jeff King 已提交
1453 1454
		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
		{ OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
1455
		  N_("ok to record a change with an empty message"),
J
Jeff King 已提交
1456 1457 1458 1459 1460
		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },

		OPT_END()
	};

1461
	struct strbuf sb = STRBUF_INIT;
1462
	struct strbuf author_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1463
	const char *index_file, *reflog_msg;
1464
	char *nl, *p;
1465
	unsigned char sha1[20];
K
Kristian Høgsberg 已提交
1466
	struct ref_lock *ref_lock;
M
Miklos Vajna 已提交
1467
	struct commit_list *parents = NULL, **pptr = &parents;
1468 1469
	struct stat statbuf;
	int allow_fast_forward = 1;
1470
	struct commit *current_head = NULL;
1471
	struct commit_extra_header *extra = NULL;
K
Kristian Høgsberg 已提交
1472

1473 1474 1475
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_commit_usage, builtin_commit_options);

1476
	wt_status_prepare(&s);
1477
	gitmodules_config();
1478
	git_config(git_commit_config, &s);
1479
	status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
1480
	determine_whence(&s);
J
Jeff King 已提交
1481
	s.colopts = 0;
K
Kristian Høgsberg 已提交
1482

1483 1484 1485
	if (get_sha1("HEAD", sha1))
		current_head = NULL;
	else {
1486
		current_head = lookup_commit_or_die(sha1, "HEAD");
1487 1488 1489
		if (!current_head || parse_commit(current_head))
			die(_("could not parse HEAD commit"));
	}
J
Jeff King 已提交
1490 1491
	argc = parse_and_validate_options(argc, argv, builtin_commit_options,
					  builtin_commit_usage,
1492
					  prefix, current_head, &s);
1493
	if (dry_run)
1494 1495
		return dry_run_commit(argc, argv, prefix, current_head, &s);
	index_file = prepare_index(argc, argv, prefix, current_head, 0);
K
Kristian Høgsberg 已提交
1496

1497 1498
	/* Set up everything for writing the commit object.  This includes
	   running hooks, writing the trees, and interacting with the user.  */
1499 1500
	if (!prepare_to_commit(index_file, prefix,
			       current_head, &s, &author_ident)) {
1501
		rollback_index_files();
K
Kristian Høgsberg 已提交
1502 1503 1504 1505
		return 1;
	}

	/* Determine parents */
1506
	reflog_msg = getenv("GIT_REFLOG_ACTION");
1507
	if (!current_head) {
1508 1509
		if (!reflog_msg)
			reflog_msg = "commit (initial)";
K
Kristian Høgsberg 已提交
1510 1511 1512
	} else if (amend) {
		struct commit_list *c;

1513 1514
		if (!reflog_msg)
			reflog_msg = "commit (amend)";
1515
		for (c = current_head->parents; c; c = c->next)
M
Miklos Vajna 已提交
1516
			pptr = &commit_list_insert(c->item, pptr)->next;
1517
	} else if (whence == FROM_MERGE) {
1518
		struct strbuf m = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1519 1520
		FILE *fp;

1521 1522
		if (!reflog_msg)
			reflog_msg = "commit (merge)";
1523
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1524 1525
		fp = fopen(git_path("MERGE_HEAD"), "r");
		if (fp == NULL)
1526
			die_errno(_("could not open '%s' for reading"),
1527
				  git_path("MERGE_HEAD"));
1528
		while (strbuf_getline(&m, fp, '\n') != EOF) {
1529 1530 1531 1532
			struct commit *parent;

			parent = get_merge_parent(m.buf);
			if (!parent)
1533
				die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1534
			pptr = &commit_list_insert(parent, pptr)->next;
1535
		}
K
Kristian Høgsberg 已提交
1536 1537
		fclose(fp);
		strbuf_release(&m);
1538 1539
		if (!stat(git_path("MERGE_MODE"), &statbuf)) {
			if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1540
				die_errno(_("could not read MERGE_MODE"));
1541 1542 1543 1544 1545
			if (!strcmp(sb.buf, "no-ff"))
				allow_fast_forward = 0;
		}
		if (allow_fast_forward)
			parents = reduce_heads(parents);
K
Kristian Høgsberg 已提交
1546
	} else {
1547
		if (!reflog_msg)
1548 1549 1550
			reflog_msg = (whence == FROM_CHERRY_PICK)
					? "commit (cherry-pick)"
					: "commit";
1551
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1552 1553
	}

1554
	/* Finally, get the commit message */
1555
	strbuf_reset(&sb);
1556
	if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1557
		int saved_errno = errno;
1558
		rollback_index_files();
1559
		die(_("could not read commit message: %s"), strerror(saved_errno));
1560
	}
1561 1562

	/* Truncate the message just before the diff, if any. */
1563 1564 1565 1566 1567
	if (verbose) {
		p = strstr(sb.buf, "\ndiff --git ");
		if (p != NULL)
			strbuf_setlen(&sb, p - sb.buf + 1);
	}
1568

1569 1570
	if (cleanup_mode != CLEANUP_NONE)
		stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1571 1572 1573 1574 1575
	if (template_untouched(&sb) && !allow_empty_message) {
		rollback_index_files();
		fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
		exit(1);
	}
1576
	if (message_is_empty(&sb) && !allow_empty_message) {
1577
		rollback_index_files();
1578
		fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
J
Jeff King 已提交
1579
		exit(1);
1580
	}
K
Kristian Høgsberg 已提交
1581

1582
	if (amend) {
1583 1584
		const char *exclude_gpgsig[2] = { "gpgsig", NULL };
		extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1585 1586 1587 1588
	} else {
		struct commit_extra_header **tail = &extra;
		append_merge_tag_headers(parents, &tail);
	}
1589

1590
	if (commit_tree_extended(&sb, active_cache_tree->sha1, parents, sha1,
J
Junio C Hamano 已提交
1591
				 author_ident.buf, sign_commit, extra)) {
1592
		rollback_index_files();
1593
		die(_("failed to write commit object"));
1594
	}
1595
	strbuf_release(&author_ident);
1596
	free_commit_extra_headers(extra);
K
Kristian Høgsberg 已提交
1597 1598

	ref_lock = lock_any_ref_for_update("HEAD",
1599 1600 1601
					   !current_head
					   ? NULL
					   : current_head->object.sha1,
K
Kristian Høgsberg 已提交
1602 1603
					   0);

M
Miklos Vajna 已提交
1604
	nl = strchr(sb.buf, '\n');
1605 1606 1607 1608 1609 1610
	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 已提交
1611

1612 1613
	if (!ref_lock) {
		rollback_index_files();
1614
		die(_("cannot lock HEAD ref"));
1615
	}
1616
	if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1617
		rollback_index_files();
1618
		die(_("cannot update HEAD ref"));
1619
	}
K
Kristian Høgsberg 已提交
1620

J
Jay Soffian 已提交
1621
	unlink(git_path("CHERRY_PICK_HEAD"));
1622
	unlink(git_path("REVERT_HEAD"));
K
Kristian Høgsberg 已提交
1623 1624
	unlink(git_path("MERGE_HEAD"));
	unlink(git_path("MERGE_MSG"));
1625
	unlink(git_path("MERGE_MODE"));
1626
	unlink(git_path("SQUASH_MSG"));
K
Kristian Høgsberg 已提交
1627

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

1633
	rerere(0);
1634
	run_hook(get_index_file(), "post-commit", NULL);
1635
	if (amend && !no_post_rewrite) {
1636 1637 1638
		struct notes_rewrite_cfg *cfg;
		cfg = init_copy_notes_for_rewrite("amend");
		if (cfg) {
1639 1640
			/* we are amending, so current_head is not NULL */
			copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1641
			finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1642
		}
1643
		run_rewrite_hook(current_head->object.sha1, sha1);
1644
	}
K
Kristian Høgsberg 已提交
1645
	if (!quiet)
1646
		print_summary(prefix, sha1, !current_head);
K
Kristian Høgsberg 已提交
1647 1648 1649

	return 0;
}