commit.c 47.2 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 210

	for (i = 0; i < active_nr; i++) {
		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
	struct pathspec pathspec;
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;
293 294 295
	parse_pathspec(&pathspec, 0,
		       PATHSPEC_PREFER_FULL,
		       prefix, argv);
K
Kristian Høgsberg 已提交
296

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
	/*
	 * 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.
	 */
339
	if (all || (also && pathspec.nr)) {
340
		fd = hold_locked_index(&index_lock, 1);
341
		add_files_to_cache(also ? prefix : NULL, pathspec.raw, 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.nr) {
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.raw))
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 537
		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("> ")));
538 539 540 541 542
		len = eol - (rb + strlen("> "));
		date = xmalloc(len + 2);
		*date = '@';
		memcpy(date + 1, rb + strlen("> "), len);
		date[len + 1] = '\0';
543 544 545 546 547 548 549
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

	if (signoff) {
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
		/*
		 * 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;
711
		}
712

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

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

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

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

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

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

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

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

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

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

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

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

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

802
	fclose(s->fp);
803

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

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

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

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

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

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

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

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 914
/*
 * 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);
}

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

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

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

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

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

969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004
/*
 * 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;
}

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

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

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

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

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

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

1073 1074 1075
	if (patch_interactive)
		interactive = 1;

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

1095
	handle_untracked_files_arg(s);
1096

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

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

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

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

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

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

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

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

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

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

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

1241
	handle_untracked_files_arg(&s);
1242 1243
	if (show_ignored_in_status)
		s.show_ignored_files = 1;
1244 1245 1246
	parse_pathspec(&s.pathspec, 0,
		       PATHSPEC_PREFER_FULL,
		       prefix, argv);
1247

1248
	read_cache_preload(&s.pathspec);
1249
	refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec.raw, NULL, NULL);
1250 1251

	fd = hold_locked_index(&index_lock, 0);
1252 1253
	if (0 <= fd)
		update_index_if_able(&the_index, &index_lock);
1254

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1382 1383
	argv[0] = find_hook("post-rewrite");
	if (!argv[0])
1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403
		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 已提交
1404 1405
int cmd_commit(int argc, const char **argv, const char *prefix)
{
J
Jeff King 已提交
1406 1407
	static struct wt_status s;
	static struct option builtin_commit_options[] = {
1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427
		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 已提交
1428 1429
		/* end commit message options */

1430 1431 1432 1433 1434 1435 1436 1437 1438
		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 已提交
1439
			    STATUS_FORMAT_SHORT),
1440
		OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
J
Jeff King 已提交
1441
		OPT_SET_INT(0, "porcelain", &status_format,
1442
			    N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
1443 1444 1445
		OPT_SET_INT(0, "long", &status_format,
			    N_("show status in long format (default)"),
			    STATUS_FORMAT_LONG),
1446
		OPT_BOOLEAN('z', "null", &s.null_termination,
1447 1448 1449 1450
			    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 已提交
1451 1452 1453
		/* end commit contents options */

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

		OPT_END()
	};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	return 0;
}