commit.c 53.0 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"
33
#include "mailmap.h"
K
Kristian Høgsberg 已提交
34 35

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

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

45 46 47 48 49 50 51 52 53 54 55 56 57 58
static const char implicit_ident_advice_noconfig[] =
N_("Your name and email address were configured automatically based\n"
"on your username and hostname. Please check that they are accurate.\n"
"You can suppress this message by setting them explicitly. Run the\n"
"following command and follow the instructions in your editor to edit\n"
"your configuration file:\n"
"\n"
"    git config --global --edit\n"
"\n"
"After doing this, you may fix the identity used for this commit with:\n"
"\n"
"    git commit --amend --reset-author\n");

static const char implicit_ident_advice_config[] =
59
N_("Your name and email address were configured automatically based\n"
60 61 62
"on your username and hostname. Please check that they are accurate.\n"
"You can suppress this message by setting them explicitly:\n"
"\n"
63
"    git config --global user.name \"Your Name\"\n"
64 65
"    git config --global user.email you@example.com\n"
"\n"
66
"After doing this, you may fix the identity used for this commit with:\n"
67
"\n"
68
"    git commit --amend --reset-author\n");
69

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

75
static const char empty_cherry_pick_advice[] =
J
Junio C Hamano 已提交
76
N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
77 78 79
"If you wish to commit it anyway, use:\n"
"\n"
"    git commit --allow-empty\n"
80 81 82 83 84 85 86
"\n");

static const char empty_cherry_pick_advice_single[] =
N_("Otherwise, please use 'git reset'\n");

static const char empty_cherry_pick_advice_multi[] =
N_("If you wish to skip this commit, use:\n"
87
"\n"
88 89 90 91
"    git reset\n"
"\n"
"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
"the remaining commits.\n");
92 93

static const char *use_message_buffer;
K
Kristian Høgsberg 已提交
94
static const char commit_editmsg[] = "COMMIT_EDITMSG";
95 96 97 98 99
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,
100
	COMMIT_PARTIAL
101
} commit_style;
K
Kristian Høgsberg 已提交
102

103
static const char *logfile, *force_author;
104
static const char *template_file;
105 106 107 108 109
/*
 * 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 已提交
110
static char *edit_message, *use_message;
111
static char *fixup_message, *squash_message;
J
Junio C Hamano 已提交
112 113
static int all, also, interactive, patch_interactive, only, amend, signoff;
static int edit_flag = -1; /* unspecified */
114
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
115
static int no_post_rewrite, allow_empty_message;
116
static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
J
Junio C Hamano 已提交
117 118
static char *sign_commit;

119 120 121 122 123 124 125 126 127 128
/*
 * 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,
129
	CLEANUP_SCISSORS,
130
	CLEANUP_ALL
131
} cleanup_mode;
132
static const char *cleanup_arg;
K
Kristian Høgsberg 已提交
133

134
static enum commit_whence whence;
135
static int sequencer_in_use;
136
static int use_editor = 1, include_status = 1;
137
static int show_ignored_in_status, have_option_m;
138
static const char *only_include_assumed;
139
static struct strbuf message = STRBUF_INIT;
140

141
static enum status_format {
142
	STATUS_FORMAT_NONE = 0,
143 144
	STATUS_FORMAT_LONG,
	STATUS_FORMAT_SHORT,
145 146 147 148
	STATUS_FORMAT_PORCELAIN,

	STATUS_FORMAT_UNSPECIFIED
} status_format = STATUS_FORMAT_UNSPECIFIED;
149

150 151 152
static int opt_parse_m(const struct option *opt, const char *arg, int unset)
{
	struct strbuf *buf = opt->value;
153 154
	if (unset) {
		have_option_m = 0;
155
		strbuf_setlen(buf, 0);
156 157
	} else {
		have_option_m = 1;
158 159
		if (buf->len)
			strbuf_addch(buf, '\n');
160
		strbuf_addstr(buf, arg);
161
		strbuf_complete_line(buf);
162 163 164
	}
	return 0;
}
K
Kristian Høgsberg 已提交
165

166 167 168 169
static void determine_whence(struct wt_status *s)
{
	if (file_exists(git_path("MERGE_HEAD")))
		whence = FROM_MERGE;
170
	else if (file_exists(git_path("CHERRY_PICK_HEAD"))) {
171
		whence = FROM_CHERRY_PICK;
172 173 174
		if (file_exists(git_path("sequencer")))
			sequencer_in_use = 1;
	}
175 176 177 178 179 180
	else
		whence = FROM_COMMIT;
	if (s)
		s->whence = whence;
}

181 182 183 184 185 186
static void status_init_config(struct wt_status *s, config_fn_t fn)
{
	wt_status_prepare(s);
	gitmodules_config();
	git_config(fn, s);
	determine_whence(s);
187
	s->hints = advice_status_hints; /* must come after git_config() */
188 189
}

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
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;
	}
}

205
static int commit_index_files(void)
206
{
207 208
	int err = 0;

209 210 211 212
	switch (commit_style) {
	case COMMIT_AS_IS:
		break; /* nothing to do */
	case COMMIT_NORMAL:
213
		err = commit_lock_file(&index_lock);
214 215
		break;
	case COMMIT_PARTIAL:
216
		err = commit_lock_file(&index_lock);
217 218 219
		rollback_lock_file(&false_lock);
		break;
	}
220 221

	return err;
222 223 224 225 226 227
}

/*
 * 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.
 */
228
static int list_paths(struct string_list *list, const char *with_tree,
229
		      const char *prefix, const struct pathspec *pattern)
230 231 232 233
{
	int i;
	char *m;

234
	if (!pattern->nr)
235 236
		return 0;

237
	m = xcalloc(1, pattern->nr);
238

239
	if (with_tree) {
240
		char *max_prefix = common_prefix(pattern);
241 242
		overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
		free(max_prefix);
243
	}
244 245

	for (i = 0; i < active_nr; i++) {
246
		const struct cache_entry *ce = active_cache[i];
247 248
		struct string_list_item *item;

249
		if (ce->ce_flags & CE_UPDATE)
250
			continue;
251
		if (!ce_path_match(ce, pattern, m))
252
			continue;
253
		item = string_list_insert(list, ce->name);
254 255
		if (ce_skip_worktree(ce))
			item->util = item; /* better a valid pointer than a fake one */
256 257
	}

258
	return report_path_error(m, pattern, prefix);
259 260
}

261
static void add_remove_files(struct string_list *list)
262 263 264
{
	int i;
	for (i = 0; i < list->nr; i++) {
265
		struct stat st;
266
		struct string_list_item *p = &(list->items[i]);
267

268 269
		/* p->util is skip-worktree */
		if (p->util)
270
			continue;
271

272 273
		if (!lstat(p->string, &st)) {
			if (add_to_cache(p->string, &st, 0))
274
				die(_("updating files failed"));
275
		} else
276
			remove_file_from_cache(p->string);
277 278 279
	}
}

280
static void create_base_index(const struct commit *current_head)
281 282 283 284 285
{
	struct tree *tree;
	struct unpack_trees_options opts;
	struct tree_desc t;

286
	if (!current_head) {
287 288 289 290 291 292 293 294
		discard_cache();
		return;
	}

	memset(&opts, 0, sizeof(opts));
	opts.head_idx = 1;
	opts.index_only = 1;
	opts.merge = 1;
295 296
	opts.src_index = &the_index;
	opts.dst_index = &the_index;
297 298

	opts.fn = oneway_merge;
299
	tree = parse_tree_indirect(current_head->object.sha1);
300
	if (!tree)
301
		die(_("failed to unpack HEAD tree object"));
302 303
	parse_tree(tree);
	init_tree_desc(&t, tree->buffer, tree->size);
304 305
	if (unpack_trees(1, &t, &opts))
		exit(128); /* We've already reported the error, finish dying */
306 307
}

308 309 310 311 312 313 314 315 316 317
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");
}

318 319
static char *prepare_index(int argc, const char **argv, const char *prefix,
			   const struct commit *current_head, int is_status)
K
Kristian Høgsberg 已提交
320
{
321
	struct string_list partial;
322
	struct pathspec pathspec;
323
	int refresh_flags = REFRESH_QUIET;
K
Kristian Høgsberg 已提交
324

325 326
	if (is_status)
		refresh_flags |= REFRESH_UNMERGED;
327 328 329
	parse_pathspec(&pathspec, 0,
		       PATHSPEC_PREFER_FULL,
		       prefix, argv);
K
Kristian Høgsberg 已提交
330

331
	if (read_cache_preload(&pathspec) < 0)
332
		die(_("index file corrupt"));
L
Linus Torvalds 已提交
333

334
	if (interactive) {
335
		char *old_index_env = NULL;
336
		hold_locked_index(&index_lock, 1);
337 338 339

		refresh_cache_or_die(refresh_flags);

340
		if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
341 342 343 344 345
			die(_("unable to create temporary index"));

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

346
		if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
347 348 349 350 351 352 353 354 355
			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);
356
		if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) {
357
			if (reopen_lock_file(&index_lock) < 0)
358
				die(_("unable to write index file"));
359 360
			if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
				die(_("unable to update temporary index"));
361 362
		} else
			warning(_("Failed to update main cache tree"));
363 364 365 366 367

		commit_style = COMMIT_NORMAL;
		return index_lock.filename;
	}

368 369 370 371 372 373 374 375 376 377 378 379
	/*
	 * 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.
	 */
380
	if (all || (also && pathspec.nr)) {
381
		hold_locked_index(&index_lock, 1);
382
		add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
383
		refresh_cache_or_die(refresh_flags);
384
		update_main_cache_tree(WRITE_TREE_SILENT);
385
		if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
386
			die(_("unable to write new_index file"));
387 388
		commit_style = COMMIT_NORMAL;
		return index_lock.filename;
K
Kristian Høgsberg 已提交
389 390
	}

391 392 393 394 395
	/*
	 * As-is commit.
	 *
	 * (1) return the name of the real index file.
	 *
396 397
	 * The caller should run hooks on the real index,
	 * and create commit from the_index.
398 399
	 * We still need to refresh the index here.
	 */
400
	if (!only && !pathspec.nr) {
401
		hold_locked_index(&index_lock, 1);
402
		refresh_cache_or_die(refresh_flags);
403 404
		if (active_cache_changed
		    || !cache_tree_fully_valid(active_cache_tree)) {
405
			update_main_cache_tree(WRITE_TREE_SILENT);
406 407 408
			active_cache_changed = 1;
		}
		if (active_cache_changed) {
409 410
			if (write_locked_index(&the_index, &index_lock,
					       COMMIT_LOCK))
411
				die(_("unable to write new_index file"));
412 413 414
		} else {
			rollback_lock_file(&index_lock);
		}
415
		commit_style = COMMIT_AS_IS;
K
Kristian Høgsberg 已提交
416 417 418
		return get_index_file();
	}

419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
	/*
	 * 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;

440 441 442 443 444 445
	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."));
	}
446

447
	string_list_init(&partial, 1);
448
	if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
449 450 451 452
		exit(1);

	discard_cache();
	if (read_cache() < 0)
453
		die(_("cannot read the index"));
454

455
	hold_locked_index(&index_lock, 1);
456
	add_remove_files(&partial);
457
	refresh_cache(REFRESH_QUIET);
458
	update_main_cache_tree(WRITE_TREE_SILENT);
459
	if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
460
		die(_("unable to write new_index file"));
K
Kristian Høgsberg 已提交
461

462 463 464 465
	hold_lock_file_for_update(&false_lock,
				  git_path("next-index-%"PRIuMAX,
					   (uintmax_t) getpid()),
				  LOCK_DIE_ON_ERROR);
466

467
	create_base_index(current_head);
468
	add_remove_files(&partial);
469
	refresh_cache(REFRESH_QUIET);
K
Kristian Høgsberg 已提交
470

471
	if (write_locked_index(&the_index, &false_lock, CLOSE_LOCK))
472
		die(_("unable to write temporary index file"));
473 474 475 476

	discard_cache();
	read_cache_from(false_lock.filename);

477
	return false_lock.filename;
K
Kristian Høgsberg 已提交
478 479
}

480 481
static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
		      struct wt_status *s)
K
Kristian Høgsberg 已提交
482
{
483 484
	unsigned char sha1[20];

485 486
	if (s->relative_paths)
		s->prefix = prefix;
K
Kristian Høgsberg 已提交
487 488

	if (amend) {
489 490
		s->amend = 1;
		s->reference = "HEAD^1";
K
Kristian Høgsberg 已提交
491
	}
492 493 494 495
	s->verbose = verbose;
	s->index_file = index_file;
	s->fp = fp;
	s->nowarn = nowarn;
496
	s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
K
Kristian Høgsberg 已提交
497

498
	wt_status_collect(s);
499 500 501

	switch (status_format) {
	case STATUS_FORMAT_SHORT:
502
		wt_shortstatus_print(s);
503 504
		break;
	case STATUS_FORMAT_PORCELAIN:
505
		wt_porcelain_print(s);
506
		break;
507 508 509
	case STATUS_FORMAT_UNSPECIFIED:
		die("BUG: finalize_deferred_config() should have been called");
		break;
510
	case STATUS_FORMAT_NONE:
511 512 513 514
	case STATUS_FORMAT_LONG:
		wt_status_print(s);
		break;
	}
K
Kristian Høgsberg 已提交
515

516
	return s->commitable;
K
Kristian Høgsberg 已提交
517 518
}

519
static int is_a_merge(const struct commit *current_head)
520
{
521
	return !!(current_head->parents && current_head->parents->next);
522 523
}

524 525 526 527 528 529 530 531 532 533
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);
}

534 535 536 537 538 539 540 541 542 543 544 545 546 547
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;
}

548
static int parse_force_date(const char *in, struct strbuf *out)
549
{
550
	strbuf_addch(out, '@');
551

552
	if (parse_date(in, out) < 0) {
553 554 555 556
		int errors = 0;
		unsigned long t = approxidate_careful(in, &errors);
		if (errors)
			return -1;
557
		strbuf_addf(out, "%lu", t);
558 559 560 561 562
	}

	return 0;
}

563 564 565 566 567 568 569 570 571 572 573 574
static void set_ident_var(char **buf, char *val)
{
	free(*buf);
	*buf = val;
}

static char *envdup(const char *var)
{
	const char *val = getenv(var);
	return val ? xstrdup(val) : NULL;
}

575
static void determine_author_info(struct strbuf *author_ident)
576 577
{
	char *name, *email, *date;
578
	struct ident_split author;
579

580 581 582
	name = envdup("GIT_AUTHOR_NAME");
	email = envdup("GIT_AUTHOR_EMAIL");
	date = envdup("GIT_AUTHOR_DATE");
583

584
	if (author_message) {
585
		struct ident_split ident;
586
		size_t len;
587
		const char *a;
588

589
		a = find_commit_header(author_message_buffer, "author", &len);
590
		if (!a)
591 592 593 594
			die(_("commit '%s' lacks author header"), author_message);
		if (split_ident_line(&ident, a, len) < 0)
			die(_("commit '%s' has malformed author line"), author_message);

595 596 597
		set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
		set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));

598
		if (ident.date_begin) {
599
			struct strbuf date_buf = STRBUF_INIT;
600 601 602 603
			strbuf_addch(&date_buf, '@');
			strbuf_add(&date_buf, ident.date_begin, ident.date_end - ident.date_begin);
			strbuf_addch(&date_buf, ' ');
			strbuf_add(&date_buf, ident.tz_begin, ident.tz_end - ident.tz_begin);
604
			set_ident_var(&date, strbuf_detach(&date_buf, NULL));
605
		}
606 607 608
	}

	if (force_author) {
609
		struct ident_split ident;
610

611
		if (split_ident_line(&ident, force_author, strlen(force_author)) < 0)
612
			die(_("malformed --author parameter"));
613 614
		set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
		set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
615 616
	}

617
	if (force_date) {
618
		struct strbuf date_buf = STRBUF_INIT;
619
		if (parse_force_date(force_date, &date_buf))
620
			die(_("invalid date format: %s"), force_date);
621
		set_ident_var(&date, strbuf_detach(&date_buf, NULL));
622 623
	}

624
	strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
625 626
	if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
	    sane_ident_split(&author)) {
627 628 629 630
		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, '@');
	}
631

632 633 634
	free(name);
	free(email);
	free(date);
635 636
}

637
static void split_ident_or_die(struct ident_split *id, const struct strbuf *buf)
638
{
639 640 641
	if (split_ident_line(id, buf->buf, buf->len) ||
	    !sane_ident_split(id))
		die(_("Malformed ident string: '%s'"), buf->buf);
642 643
}

644 645 646
static int author_date_is_interesting(void)
{
	return author_message || force_date;
647 648
}

649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678
static void adjust_comment_line_char(const struct strbuf *sb)
{
	char candidates[] = "#;@!$%^&|:";
	char *candidate;
	const char *p;

	comment_line_char = candidates[0];
	if (!memchr(sb->buf, comment_line_char, sb->len))
		return;

	p = sb->buf;
	candidate = strchr(candidates, *p);
	if (candidate)
		*candidate = ' ';
	for (p = sb->buf; *p; p++) {
		if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
			candidate = strchr(candidates, p[1]);
			if (candidate)
				*candidate = ' ';
		}
	}

	for (p = candidates; *p == ' '; p++)
		;
	if (!*p)
		die(_("unable to select a comment character that is not used\n"
		      "in the current commit message"));
	comment_line_char = *p;
}

679
static int prepare_to_commit(const char *index_file, const char *prefix,
680
			     struct commit *current_head,
681 682
			     struct wt_status *s,
			     struct strbuf *author_ident)
K
Kristian Høgsberg 已提交
683 684
{
	struct stat statbuf;
685
	struct strbuf committer_ident = STRBUF_INIT;
686
	int commitable;
687
	struct strbuf sb = STRBUF_INIT;
688 689
	const char *hook_arg1 = NULL;
	const char *hook_arg2 = NULL;
690
	int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
691
	int old_display_comment_prefix;
K
Kristian Høgsberg 已提交
692

693 694 695
	/* This checks and barfs if author is badly specified */
	determine_author_info(author_ident);

696
	if (!no_verify && run_commit_hook(use_editor, index_file, "pre-commit", NULL))
697
		return 0;
K
Kristian Høgsberg 已提交
698

699 700 701 702 703 704 705 706 707 708 709 710
	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)
711
				die(_("could not lookup commit %s"), squash_message);
712 713 714 715 716 717
			ctx.output_encoding = get_commit_output_encoding();
			format_commit_message(c, "squash! %s\n\n", &sb,
					      &ctx);
		}
	}

718 719
	if (message.len) {
		strbuf_addbuf(&sb, &message);
720
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
721 722
	} else if (logfile && !strcmp(logfile, "-")) {
		if (isatty(0))
723
			fprintf(stderr, _("(reading log message from standard input)\n"));
K
Kristian Høgsberg 已提交
724
		if (strbuf_read(&sb, 0, 0) < 0)
725
			die_errno(_("could not read log from standard input"));
726
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
727 728
	} else if (logfile) {
		if (strbuf_read_file(&sb, logfile, 0) < 0)
729
			die_errno(_("could not read log file '%s'"),
730
				  logfile);
731
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
732
	} else if (use_message) {
733
		char *buffer;
K
Kristian Høgsberg 已提交
734
		buffer = strstr(use_message_buffer, "\n\n");
735
		if (buffer)
736
			strbuf_addstr(&sb, buffer + 2);
737 738
		hook_arg1 = "commit";
		hook_arg2 = use_message;
739 740 741 742 743
	} else if (fixup_message) {
		struct pretty_print_context ctx = {0};
		struct commit *commit;
		commit = lookup_commit_reference_by_name(fixup_message);
		if (!commit)
744
			die(_("could not lookup commit %s"), fixup_message);
745 746 747 748
		ctx.output_encoding = get_commit_output_encoding();
		format_commit_message(commit, "fixup! %s\n\n",
				      &sb, &ctx);
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
749 750
	} else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
		if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
751
			die_errno(_("could not read MERGE_MSG"));
752
		hook_arg1 = "merge";
K
Kristian Høgsberg 已提交
753 754
	} else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
		if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
755
			die_errno(_("could not read SQUASH_MSG"));
756
		hook_arg1 = "squash";
757
	} else if (template_file) {
K
Kristian Høgsberg 已提交
758
		if (strbuf_read_file(&sb, template_file, 0) < 0)
759
			die_errno(_("could not read '%s'"), template_file);
760
		hook_arg1 = "template";
761
		clean_message_contents = 0;
K
Kristian Høgsberg 已提交
762 763
	}

764
	/*
765 766
	 * The remaining cases don't modify the template message, but
	 * just set the argument(s) to the prepare-commit-msg hook.
767
	 */
768
	else if (whence == FROM_MERGE)
769
		hook_arg1 = "merge";
770 771 772 773
	else if (whence == FROM_CHERRY_PICK) {
		hook_arg1 = "commit";
		hook_arg2 = "CHERRY_PICK_HEAD";
	}
774

775 776 777 778 779 780 781 782 783 784
	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 = "";
	}

785 786
	s->fp = fopen(git_path(commit_editmsg), "w");
	if (s->fp == NULL)
787
		die_errno(_("could not open '%s'"), git_path(commit_editmsg));
K
Kristian Høgsberg 已提交
788

789 790 791 792
	/* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
	old_display_comment_prefix = s->display_comment_prefix;
	s->display_comment_prefix = 1;

793 794 795 796 797 798
	/*
	 * Most hints are counter-productive when the commit has
	 * already started.
	 */
	s->hints = 0;

799
	if (clean_message_contents)
800
		stripspace(&sb, 0);
K
Kristian Høgsberg 已提交
801 802

	if (signoff) {
803 804 805 806 807 808 809 810 811 812 813 814 815 816
		/*
		 * 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;
817
			if (starts_with(sb.buf + previous, "\nConflicts:\n")) {
818 819 820 821 822 823
				ignore_footer = sb.len - previous;
				break;
			}
			while (i < eol)
				i++;
			previous = eol;
824
		}
825

826
		append_signoff(&sb, ignore_footer, 0);
K
Kristian Høgsberg 已提交
827 828
	}

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

832 833
	if (auto_comment_line_char)
		adjust_comment_line_char(&sb);
K
Kristian Høgsberg 已提交
834 835
	strbuf_release(&sb);

836
	/* This checks if committer ident is explicitly given */
837
	strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
838
	if (use_editor && include_status) {
839 840
		int ident_shown = 0;
		int saved_color_setting;
841 842
		struct ident_split ci, ai;

843 844 845
		if (whence != FROM_COMMIT) {
			if (cleanup_mode == CLEANUP_SCISSORS)
				wt_status_add_cut_line(s->fp);
846
			status_printf_ln(s, GIT_COLOR_NORMAL,
847 848 849 850 851 852 853 854 855 856 857
			    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"),
858 859 860
				git_path(whence == FROM_MERGE
					 ? "MERGE_HEAD"
					 : "CHERRY_PICK_HEAD"));
861
		}
862

863
		fprintf(s->fp, "\n");
864
		if (cleanup_mode == CLEANUP_ALL)
865 866
			status_printf(s, GIT_COLOR_NORMAL,
				_("Please enter the commit message for your changes."
J
Junio C Hamano 已提交
867 868
				  " Lines starting\nwith '%c' will be ignored, and an empty"
				  " message aborts the commit.\n"), comment_line_char);
869 870
		else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
			wt_status_add_cut_line(s->fp);
871
		else /* CLEANUP_SPACE, that is. */
872 873
			status_printf(s, GIT_COLOR_NORMAL,
				_("Please enter the commit message for your changes."
J
Junio C Hamano 已提交
874 875 876 877
				  " 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);
878
		if (only_include_assumed)
879 880
			status_printf_ln(s, GIT_COLOR_NORMAL,
					"%s", only_include_assumed);
881

882 883 884 885
		split_ident_or_die(&ai, author_ident);
		split_ident_or_die(&ci, &committer_ident);

		if (ident_cmp(&ai, &ci))
886
			status_printf_ln(s, GIT_COLOR_NORMAL,
887
				_("%s"
888
				"Author:    %.*s <%.*s>"),
889
				ident_shown++ ? "" : "\n",
890 891
				(int)(ai.name_end - ai.name_begin), ai.name_begin,
				(int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
892

893 894 895 896 897 898
		if (author_date_is_interesting())
			status_printf_ln(s, GIT_COLOR_NORMAL,
				_("%s"
				"Date:      %s"),
				ident_shown++ ? "" : "\n",
				show_ident_date(&ai, DATE_NORMAL));
899

900
		if (!committer_ident_sufficiently_given())
901
			status_printf_ln(s, GIT_COLOR_NORMAL,
902
				_("%s"
903
				"Committer: %.*s <%.*s>"),
904
				ident_shown++ ? "" : "\n",
905 906
				(int)(ci.name_end - ci.name_begin), ci.name_begin,
				(int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
907 908

		if (ident_shown)
909
			status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
910

911 912
		saved_color_setting = s->use_color;
		s->use_color = 0;
913
		commitable = run_status(s->fp, index_file, prefix, 1, s);
914
		s->use_color = saved_color_setting;
915
	} else {
916
		unsigned char sha1[20];
917
		const char *parent = "HEAD";
918 919

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

922 923 924
		if (amend)
			parent = "HEAD^1";

925
		if (get_sha1(parent, sha1))
926
			commitable = !!active_nr;
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942
		else {
			/*
			 * Unless the user did explicitly request a submodule
			 * ignore mode by passing a command line option we do
			 * not ignore any changed submodule SHA-1s when
			 * comparing index and parent, no matter what is
			 * configured. Otherwise we won't commit any
			 * submodules which were manually staged, which would
			 * be really confusing.
			 */
			int diff_flags = DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG;
			if (ignore_submodule_arg &&
			    !strcmp(ignore_submodule_arg, "all"))
				diff_flags |= DIFF_OPT_IGNORE_SUBMODULES;
			commitable = index_differs_from(parent, diff_flags);
		}
943
	}
944
	strbuf_release(&committer_ident);
945

946
	fclose(s->fp);
947

948 949 950 951 952 953
	/*
	 * 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 &&
954
	    !(amend && is_a_merge(current_head))) {
955
		s->display_comment_prefix = old_display_comment_prefix;
956
		run_status(stdout, index_file, prefix, 0, s);
J
Jeff King 已提交
957
		if (amend)
958
			fputs(_(empty_amend_advice), stderr);
959
		else if (whence == FROM_CHERRY_PICK) {
J
Junio C Hamano 已提交
960
			fputs(_(empty_cherry_pick_advice), stderr);
961 962 963 964 965
			if (!sequencer_in_use)
				fputs(_(empty_cherry_pick_advice_single), stderr);
			else
				fputs(_(empty_cherry_pick_advice_multi), stderr);
		}
966
		return 0;
967 968
	}

969 970 971 972 973 974 975
	/*
	 * 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);
976
	if (update_main_cache_tree(0)) {
977
		error(_("Error building trees"));
978
		return 0;
979
	}
K
Kristian Høgsberg 已提交
980

981 982
	if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
			    git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
983
		return 0;
K
Kristian Høgsberg 已提交
984

985 986
	if (use_editor) {
		char index[PATH_MAX];
987 988
		const char *env[2] = { NULL };
		env[0] =  index;
989
		snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
S
Stephan Beyer 已提交
990 991
		if (launch_editor(git_path(commit_editmsg), NULL, env)) {
			fprintf(stderr,
992
			_("Please supply the message using either -m or -F option.\n"));
S
Stephan Beyer 已提交
993 994
			exit(1);
		}
995
	}
K
Kristian Høgsberg 已提交
996

997
	if (!no_verify &&
998
	    run_commit_hook(use_editor, index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
999 1000
		return 0;
	}
K
Kristian Høgsberg 已提交
1001

1002
	return 1;
K
Kristian Høgsberg 已提交
1003 1004
}

1005
static int rest_is_empty(struct strbuf *sb, int start)
K
Kristian Høgsberg 已提交
1006
{
1007
	int i, eol;
K
Kristian Høgsberg 已提交
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
	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 &&
1019
		    starts_with(sb->buf + i, sign_off_header)) {
K
Kristian Høgsberg 已提交
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
			i = eol;
			continue;
		}
		while (i < eol)
			if (!isspace(sb->buf[i++]))
				return 0;
	}

	return 1;
}

1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
/*
 * 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;
1049
	const char *start;
1050 1051 1052 1053 1054 1055 1056 1057

	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);
1058
	if (!skip_prefix(sb->buf, tmpl.buf, &start))
1059 1060 1061 1062 1063
		start = sb->buf;
	strbuf_release(&tmpl);
	return rest_is_empty(sb, start - sb->buf);
}

1064 1065 1066 1067 1068
static const char *find_author_by_nickname(const char *name)
{
	struct rev_info revs;
	struct commit *commit;
	struct strbuf buf = STRBUF_INIT;
1069
	struct string_list mailmap = STRING_LIST_INIT_NODUP;
1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
	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);
1080 1081 1082
	revs.mailmap = &mailmap;
	read_mailmap(revs.mailmap, NULL);

1083 1084
	if (prepare_revision_walk(&revs))
		die(_("revision walk setup failed"));
1085 1086
	commit = get_revision(&revs);
	if (commit) {
1087 1088
		struct pretty_print_context ctx = {0};
		ctx.date_mode = DATE_NORMAL;
1089
		strbuf_release(&buf);
1090 1091
		format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
		clear_mailmap(&mailmap);
1092 1093
		return strbuf_detach(&buf, NULL);
	}
1094
	die(_("No existing author found with '%s'"), name);
1095 1096
}

1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108

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

1112 1113
static const char *read_commit_message(const char *name)
{
J
Jeff King 已提交
1114
	const char *out_enc;
1115 1116 1117 1118
	struct commit *commit;

	commit = lookup_commit_reference_by_name(name);
	if (!commit)
J
Junio C Hamano 已提交
1119
		die(_("could not lookup commit %s"), name);
1120
	out_enc = get_commit_output_encoding();
1121
	return logmsg_reencode(commit, NULL, out_enc);
1122 1123
}

1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
/*
 * 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;
}

1160
static int parse_and_validate_options(int argc, const char *argv[],
J
Jeff King 已提交
1161
				      const struct option *options,
1162
				      const char * const usage[],
1163
				      const char *prefix,
1164
				      struct commit *current_head,
1165
				      struct wt_status *s)
K
Kristian Høgsberg 已提交
1166 1167 1168
{
	int f = 0;

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

1172 1173 1174
	if (force_author && !strchr(force_author, '>'))
		force_author = find_author_by_nickname(force_author);

1175
	if (force_author && renew_authorship)
1176
		die(_("Using both --reset-author and --author does not make sense"));
1177

1178
	if (logfile || have_option_m || use_message || fixup_message)
1179
		use_editor = 0;
J
Junio C Hamano 已提交
1180 1181
	if (0 <= edit_flag)
		use_editor = edit_flag;
K
Kristian Høgsberg 已提交
1182 1183

	/* Sanity check options */
1184
	if (amend && !current_head)
1185
		die(_("You have nothing to amend."));
1186 1187 1188 1189 1190 1191
	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."));
	}
1192
	if (fixup_message && squash_message)
1193
		die(_("Options --squash and --fixup cannot be used together"));
K
Kristian Høgsberg 已提交
1194 1195 1196 1197
	if (use_message)
		f++;
	if (edit_message)
		f++;
1198 1199
	if (fixup_message)
		f++;
K
Kristian Høgsberg 已提交
1200 1201 1202
	if (logfile)
		f++;
	if (f > 1)
1203
		die(_("Only one of -c/-C/-F/--fixup can be used."));
1204
	if (message.len && f > 0)
1205
		die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1206 1207
	if (f || message.len)
		template_file = NULL;
K
Kristian Høgsberg 已提交
1208 1209
	if (edit_message)
		use_message = edit_message;
1210
	if (amend && !use_message && !fixup_message)
K
Kristian Høgsberg 已提交
1211
		use_message = "HEAD";
1212
	if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1213
		die(_("--reset-author can be used only with -C, -c or --amend."));
K
Kristian Høgsberg 已提交
1214
	if (use_message) {
1215 1216 1217 1218 1219 1220 1221 1222 1223
		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 已提交
1224 1225
	}

1226 1227 1228
	if (patch_interactive)
		interactive = 1;

1229
	if (also + only + all + interactive > 1)
1230
		die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
K
Kristian Høgsberg 已提交
1231
	if (argc == 0 && (also || (only && !amend)))
1232
		die(_("No paths with --include/--only does not make sense."));
K
Kristian Høgsberg 已提交
1233
	if (argc == 0 && only && amend)
1234
		only_include_assumed = _("Clever... amending the last one with dirty index.");
1235
	if (argc > 0 && !also && !only)
1236
		only_include_assumed = _("Explicit paths specified without -i or -o; assuming --only paths...");
1237 1238 1239 1240 1241 1242 1243 1244
	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;
1245 1246
	else if (!strcmp(cleanup_arg, "scissors"))
		cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
1247
	else
1248
		die(_("Invalid cleanup mode %s"), cleanup_arg);
K
Kristian Høgsberg 已提交
1249

1250
	handle_untracked_files_arg(s);
1251

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

1255
	if (status_format != STATUS_FORMAT_NONE)
1256 1257
		dry_run = 1;

K
Kristian Høgsberg 已提交
1258 1259 1260
	return argc;
}

1261
static int dry_run_commit(int argc, const char **argv, const char *prefix,
1262
			  const struct commit *current_head, struct wt_status *s)
K
Kristian Høgsberg 已提交
1263 1264
{
	int commitable;
J
Junio C Hamano 已提交
1265
	const char *index_file;
K
Kristian Høgsberg 已提交
1266

1267
	index_file = prepare_index(argc, argv, prefix, current_head, 1);
1268
	commitable = run_status(stdout, index_file, prefix, 0, s);
J
Junio C Hamano 已提交
1269
	rollback_index_files();
K
Kristian Høgsberg 已提交
1270

J
Junio C Hamano 已提交
1271 1272 1273
	return commitable ? 0 : 1;
}

1274 1275 1276 1277
static int parse_status_slot(const char *var, int offset)
{
	if (!strcasecmp(var+offset, "header"))
		return WT_STATUS_HEADER;
1278 1279
	if (!strcasecmp(var+offset, "branch"))
		return WT_STATUS_ONBRANCH;
1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290
	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 已提交
1291
	return -1;
1292 1293 1294 1295 1296 1297
}

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

1298
	if (starts_with(k, "column."))
J
Jeff King 已提交
1299
		return git_column_config(k, v, "status", &s->colopts);
1300 1301 1302 1303 1304 1305 1306
	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;
	}
1307 1308
	if (!strcmp(k, "status.short")) {
		if (git_config_bool(k, v))
1309
			status_deferred_config.status_format = STATUS_FORMAT_SHORT;
1310
		else
1311
			status_deferred_config.status_format = STATUS_FORMAT_NONE;
1312 1313
		return 0;
	}
1314
	if (!strcmp(k, "status.branch")) {
1315
		status_deferred_config.show_branch = git_config_bool(k, v);
1316 1317
		return 0;
	}
1318
	if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1319
		s->use_color = git_config_colorbool(k, v);
1320 1321
		return 0;
	}
1322 1323 1324 1325
	if (!strcmp(k, "status.displaycommentprefix")) {
		s->display_comment_prefix = git_config_bool(k, v);
		return 0;
	}
1326
	if (starts_with(k, "status.color.") || starts_with(k, "color.status.")) {
1327
		int slot = parse_status_slot(k, 13);
J
Jeff King 已提交
1328 1329
		if (slot < 0)
			return 0;
1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348
		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
1349
			return error(_("Invalid untracked files mode '%s'"), v);
1350 1351 1352 1353 1354
		return 0;
	}
	return git_diff_ui_config(k, v, NULL);
}

J
Junio C Hamano 已提交
1355 1356
int cmd_status(int argc, const char **argv, const char *prefix)
{
J
Jeff King 已提交
1357
	static struct wt_status s;
1358
	int fd;
1359
	unsigned char sha1[20];
1360
	static struct option builtin_status_options[] = {
1361
		OPT__VERBOSE(&verbose, N_("be verbose")),
1362
		OPT_SET_INT('s', "short", &status_format,
1363
			    N_("show status concisely"), STATUS_FORMAT_SHORT),
1364 1365
		OPT_BOOL('b', "branch", &s.show_branch,
			 N_("show branch information")),
1366
		OPT_SET_INT(0, "porcelain", &status_format,
1367
			    N_("machine-readable output"),
1368
			    STATUS_FORMAT_PORCELAIN),
1369 1370 1371
		OPT_SET_INT(0, "long", &status_format,
			    N_("show status in long format (default)"),
			    STATUS_FORMAT_LONG),
1372 1373
		OPT_BOOL('z', "null", &s.null_termination,
			 N_("terminate entries with NUL")),
1374
		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1375 1376
		  N_("mode"),
		  N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
1377
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1378 1379
		OPT_BOOL(0, "ignored", &show_ignored_in_status,
			 N_("show ignored files")),
1380 1381
		{ OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
		  N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
1382
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1383
		OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
1384 1385 1386
		OPT_END(),
	};

1387 1388 1389
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_status_usage, builtin_status_options);

1390
	status_init_config(&s, git_status_config);
1391
	argc = parse_options(argc, argv, prefix,
1392 1393
			     builtin_status_options,
			     builtin_status_usage, 0);
J
Jeff King 已提交
1394
	finalize_colopts(&s.colopts, -1);
1395
	finalize_deferred_config(&s);
1396

1397
	handle_untracked_files_arg(&s);
1398 1399
	if (show_ignored_in_status)
		s.show_ignored_files = 1;
1400 1401 1402
	parse_pathspec(&s.pathspec, 0,
		       PATHSPEC_PREFER_FULL,
		       prefix, argv);
1403

1404
	read_cache_preload(&s.pathspec);
1405
	refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
1406 1407

	fd = hold_locked_index(&index_lock, 0);
1408 1409
	if (0 <= fd)
		update_index_if_able(&the_index, &index_lock);
1410

1411
	s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1412
	s.ignore_submodule_arg = ignore_submodule_arg;
1413 1414
	wt_status_collect(&s);

J
Jeff King 已提交
1415 1416
	if (s.relative_paths)
		s.prefix = prefix;
1417

1418 1419
	switch (status_format) {
	case STATUS_FORMAT_SHORT:
1420
		wt_shortstatus_print(&s);
1421
		break;
1422
	case STATUS_FORMAT_PORCELAIN:
1423
		wt_porcelain_print(&s);
1424
		break;
1425 1426 1427
	case STATUS_FORMAT_UNSPECIFIED:
		die("BUG: finalize_deferred_config() should have been called");
		break;
1428
	case STATUS_FORMAT_NONE:
1429
	case STATUS_FORMAT_LONG:
1430
		s.verbose = verbose;
1431
		s.ignore_submodule_arg = ignore_submodule_arg;
1432
		wt_status_print(&s);
1433
		break;
1434
	}
1435
	return 0;
K
Kristian Høgsberg 已提交
1436 1437
}

1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455
static const char *implicit_ident_advice(void)
{
	char *user_config = NULL;
	char *xdg_config = NULL;
	int config_exists;

	home_config_paths(&user_config, &xdg_config, "config");
	config_exists = file_exists(user_config) || file_exists(xdg_config);
	free(user_config);
	free(xdg_config);

	if (config_exists)
		return _(implicit_ident_advice_config);
	else
		return _(implicit_ident_advice_noconfig);

}

1456 1457
static void print_summary(const char *prefix, const unsigned char *sha1,
			  int initial_commit)
K
Kristian Høgsberg 已提交
1458 1459 1460
{
	struct rev_info rev;
	struct commit *commit;
1461
	struct strbuf format = STRBUF_INIT;
J
Jeff King 已提交
1462
	unsigned char junk_sha1[20];
1463
	const char *head;
1464 1465 1466
	struct pretty_print_context pctx = {0};
	struct strbuf author_ident = STRBUF_INIT;
	struct strbuf committer_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1467 1468 1469

	commit = lookup_commit(sha1);
	if (!commit)
1470
		die(_("couldn't look up newly created commit"));
1471
	if (parse_commit(commit))
1472
		die(_("could not parse newly created commit"));
K
Kristian Høgsberg 已提交
1473

1474 1475 1476 1477 1478 1479 1480 1481
	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);
	}
1482 1483 1484 1485 1486 1487 1488
	if (author_date_is_interesting()) {
		struct strbuf date = STRBUF_INIT;
		format_commit_message(commit, "%ad", &date, &pctx);
		strbuf_addstr(&format, "\n Date: ");
		strbuf_addbuf_percentquote(&format, &date);
		strbuf_release(&date);
	}
1489
	if (!committer_ident_sufficiently_given()) {
1490 1491
		strbuf_addstr(&format, "\n Committer: ");
		strbuf_addbuf_percentquote(&format, &committer_ident);
1492 1493
		if (advice_implicit_identity) {
			strbuf_addch(&format, '\n');
1494
			strbuf_addstr(&format, implicit_ident_advice());
1495
		}
1496 1497 1498 1499
	}
	strbuf_release(&author_ident);
	strbuf_release(&committer_ident);

K
Kristian Høgsberg 已提交
1500 1501 1502 1503 1504 1505 1506 1507 1508
	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;
1509
	get_commit_format(format.buf, &rev);
1510
	rev.always_show_header = 0;
1511 1512
	rev.diffopt.detect_rename = 1;
	rev.diffopt.break_opt = 0;
1513
	diff_setup_done(&rev.diffopt);
K
Kristian Høgsberg 已提交
1514

1515
	head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1516
	printf("[%s%s ",
1517
		starts_with(head, "refs/heads/") ?
J
Jeff King 已提交
1518 1519
			head + 11 :
			!strcmp(head, "HEAD") ?
1520
				_("detached HEAD") :
J
Jeff King 已提交
1521
				head,
1522
		initial_commit ? _(" (root-commit)") : "");
K
Kristian Høgsberg 已提交
1523

1524
	if (!log_tree_commit(&rev, commit)) {
1525 1526 1527
		rev.always_show_header = 1;
		rev.use_terminator = 1;
		log_tree_commit(&rev, commit);
1528
	}
1529

1530
	strbuf_release(&format);
K
Kristian Høgsberg 已提交
1531 1532
}

1533
static int git_commit_config(const char *k, const char *v, void *cb)
K
Kristian Høgsberg 已提交
1534
{
1535
	struct wt_status *s = cb;
J
Junio C Hamano 已提交
1536
	int status;
1537

1538
	if (!strcmp(k, "commit.template"))
1539
		return git_config_pathname(&template_file, k, v);
1540 1541 1542 1543
	if (!strcmp(k, "commit.status")) {
		include_status = git_config_bool(k, v);
		return 0;
	}
1544 1545
	if (!strcmp(k, "commit.cleanup"))
		return git_config_string(&cleanup_arg, k, v);
1546 1547 1548 1549
	if (!strcmp(k, "commit.gpgsign")) {
		sign_commit = git_config_bool(k, v) ? "" : NULL;
		return 0;
	}
K
Kristian Høgsberg 已提交
1550

J
Junio C Hamano 已提交
1551 1552 1553
	status = git_gpg_config(k, v, NULL);
	if (status)
		return status;
1554
	return git_status_config(k, v, s);
K
Kristian Høgsberg 已提交
1555 1556
}

1557 1558 1559 1560 1561
static int run_rewrite_hook(const unsigned char *oldsha1,
			    const unsigned char *newsha1)
{
	/* oldsha1 SP newsha1 LF NUL */
	static char buf[2*40 + 3];
1562
	struct child_process proc = CHILD_PROCESS_INIT;
1563 1564 1565 1566
	const char *argv[3];
	int code;
	size_t n;

1567 1568
	argv[0] = find_hook("post-rewrite");
	if (!argv[0])
1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587
		return 0;

	argv[1] = "amend";
	argv[2] = NULL;

	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);
}

1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
{
	const char *hook_env[3] =  { NULL };
	char index[PATH_MAX];
	va_list args;
	int ret;

	snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
	hook_env[0] = index;

	/*
	 * Let the hook know that no editor will be launched.
	 */
	if (!editor_is_used)
		hook_env[1] = "GIT_EDITOR=:";

	va_start(args, name);
	ret = run_hook_ve(hook_env, name, args);
	va_end(args);

	return ret;
}

K
Kristian Høgsberg 已提交
1611 1612
int cmd_commit(int argc, const char **argv, const char *prefix)
{
J
Jeff King 已提交
1613 1614
	static struct wt_status s;
	static struct option builtin_commit_options[] = {
1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626
		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")),
1627 1628
		OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
		OPT_BOOL('s', "signoff", &signoff, N_("add Signed-off-by:")),
1629 1630 1631
		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")),
1632
		OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
1633
		{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
1634
		  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
J
Jeff King 已提交
1635 1636
		/* end commit message options */

1637
		OPT_GROUP(N_("Commit contents options")),
1638 1639 1640 1641 1642 1643 1644
		OPT_BOOL('a', "all", &all, N_("commit all changed files")),
		OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")),
		OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
		OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
		OPT_BOOL('o', "only", &only, N_("commit only specified files")),
		OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit hook")),
		OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),
1645
		OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
J
Jeff King 已提交
1646
			    STATUS_FORMAT_SHORT),
1647
		OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
J
Jeff King 已提交
1648
		OPT_SET_INT(0, "porcelain", &status_format,
1649
			    N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
1650 1651 1652
		OPT_SET_INT(0, "long", &status_format,
			    N_("show status in long format (default)"),
			    STATUS_FORMAT_LONG),
1653 1654 1655 1656
		OPT_BOOL('z', "null", &s.null_termination,
			 N_("terminate entries with NUL")),
		OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
		OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
1657
		{ 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 已提交
1658 1659
		/* end commit contents options */

1660 1661 1662 1663
		OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
				N_("ok to record an empty change")),
		OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message,
				N_("ok to record a change with an empty message")),
J
Jeff King 已提交
1664 1665 1666 1667

		OPT_END()
	};

1668
	struct strbuf sb = STRBUF_INIT;
1669
	struct strbuf author_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1670
	const char *index_file, *reflog_msg;
1671
	char *nl;
1672
	unsigned char sha1[20];
M
Miklos Vajna 已提交
1673
	struct commit_list *parents = NULL, **pptr = &parents;
1674
	struct stat statbuf;
1675
	struct commit *current_head = NULL;
1676
	struct commit_extra_header *extra = NULL;
1677 1678
	struct ref_transaction *transaction;
	struct strbuf err = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1679

1680 1681 1682
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_commit_usage, builtin_commit_options);

1683
	status_init_config(&s, git_commit_config);
1684
	status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
J
Jeff King 已提交
1685
	s.colopts = 0;
K
Kristian Høgsberg 已提交
1686

1687 1688 1689
	if (get_sha1("HEAD", sha1))
		current_head = NULL;
	else {
1690
		current_head = lookup_commit_or_die(sha1, "HEAD");
1691
		if (parse_commit(current_head))
1692 1693
			die(_("could not parse HEAD commit"));
	}
J
Jeff King 已提交
1694 1695
	argc = parse_and_validate_options(argc, argv, builtin_commit_options,
					  builtin_commit_usage,
1696
					  prefix, current_head, &s);
1697
	if (dry_run)
1698 1699
		return dry_run_commit(argc, argv, prefix, current_head, &s);
	index_file = prepare_index(argc, argv, prefix, current_head, 0);
K
Kristian Høgsberg 已提交
1700

1701 1702
	/* Set up everything for writing the commit object.  This includes
	   running hooks, writing the trees, and interacting with the user.  */
1703 1704
	if (!prepare_to_commit(index_file, prefix,
			       current_head, &s, &author_ident)) {
1705
		rollback_index_files();
K
Kristian Høgsberg 已提交
1706 1707 1708 1709
		return 1;
	}

	/* Determine parents */
1710
	reflog_msg = getenv("GIT_REFLOG_ACTION");
1711
	if (!current_head) {
1712 1713
		if (!reflog_msg)
			reflog_msg = "commit (initial)";
K
Kristian Høgsberg 已提交
1714 1715 1716
	} else if (amend) {
		struct commit_list *c;

1717 1718
		if (!reflog_msg)
			reflog_msg = "commit (amend)";
1719
		for (c = current_head->parents; c; c = c->next)
M
Miklos Vajna 已提交
1720
			pptr = &commit_list_insert(c->item, pptr)->next;
1721
	} else if (whence == FROM_MERGE) {
1722
		struct strbuf m = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1723
		FILE *fp;
1724
		int allow_fast_forward = 1;
K
Kristian Høgsberg 已提交
1725

1726 1727
		if (!reflog_msg)
			reflog_msg = "commit (merge)";
1728
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1729 1730
		fp = fopen(git_path("MERGE_HEAD"), "r");
		if (fp == NULL)
1731
			die_errno(_("could not open '%s' for reading"),
1732
				  git_path("MERGE_HEAD"));
1733
		while (strbuf_getline(&m, fp, '\n') != EOF) {
1734 1735 1736 1737
			struct commit *parent;

			parent = get_merge_parent(m.buf);
			if (!parent)
1738
				die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1739
			pptr = &commit_list_insert(parent, pptr)->next;
1740
		}
K
Kristian Høgsberg 已提交
1741 1742
		fclose(fp);
		strbuf_release(&m);
1743 1744
		if (!stat(git_path("MERGE_MODE"), &statbuf)) {
			if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1745
				die_errno(_("could not read MERGE_MODE"));
1746 1747 1748 1749 1750
			if (!strcmp(sb.buf, "no-ff"))
				allow_fast_forward = 0;
		}
		if (allow_fast_forward)
			parents = reduce_heads(parents);
K
Kristian Høgsberg 已提交
1751
	} else {
1752
		if (!reflog_msg)
1753 1754 1755
			reflog_msg = (whence == FROM_CHERRY_PICK)
					? "commit (cherry-pick)"
					: "commit";
1756
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1757 1758
	}

1759
	/* Finally, get the commit message */
1760
	strbuf_reset(&sb);
1761
	if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1762
		int saved_errno = errno;
1763
		rollback_index_files();
1764
		die(_("could not read commit message: %s"), strerror(saved_errno));
1765
	}
1766

1767 1768
	if (verbose || /* Truncate the message just before the diff, if any. */
	    cleanup_mode == CLEANUP_SCISSORS)
1769
		wt_status_truncate_message_at_cut_line(&sb);
1770

1771 1772
	if (cleanup_mode != CLEANUP_NONE)
		stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1773 1774 1775 1776 1777
	if (template_untouched(&sb) && !allow_empty_message) {
		rollback_index_files();
		fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
		exit(1);
	}
1778
	if (message_is_empty(&sb) && !allow_empty_message) {
1779
		rollback_index_files();
1780
		fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
J
Jeff King 已提交
1781
		exit(1);
1782
	}
K
Kristian Høgsberg 已提交
1783

1784
	if (amend) {
1785 1786
		const char *exclude_gpgsig[2] = { "gpgsig", NULL };
		extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1787 1788 1789 1790
	} else {
		struct commit_extra_header **tail = &extra;
		append_merge_tag_headers(parents, &tail);
	}
1791

1792 1793
	if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->sha1,
			 parents, sha1, author_ident.buf, sign_commit, extra)) {
1794
		rollback_index_files();
1795
		die(_("failed to write commit object"));
1796
	}
1797
	strbuf_release(&author_ident);
1798
	free_commit_extra_headers(extra);
K
Kristian Høgsberg 已提交
1799

M
Miklos Vajna 已提交
1800
	nl = strchr(sb.buf, '\n');
1801 1802 1803 1804 1805 1806
	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 已提交
1807

1808 1809 1810 1811 1812 1813 1814
	transaction = ref_transaction_begin(&err);
	if (!transaction ||
	    ref_transaction_update(transaction, "HEAD", sha1,
				   current_head
				   ? current_head->object.sha1 : NULL,
				   0, !!current_head, &err) ||
	    ref_transaction_commit(transaction, sb.buf, &err)) {
1815
		rollback_index_files();
1816
		die("%s", err.buf);
1817
	}
1818
	ref_transaction_free(transaction);
K
Kristian Høgsberg 已提交
1819

J
Jay Soffian 已提交
1820
	unlink(git_path("CHERRY_PICK_HEAD"));
1821
	unlink(git_path("REVERT_HEAD"));
K
Kristian Høgsberg 已提交
1822 1823
	unlink(git_path("MERGE_HEAD"));
	unlink(git_path("MERGE_MSG"));
1824
	unlink(git_path("MERGE_MODE"));
1825
	unlink(git_path("SQUASH_MSG"));
K
Kristian Høgsberg 已提交
1826

1827
	if (commit_index_files())
1828
		die (_("Repository has been updated, but unable to write\n"
A
Alex Henrie 已提交
1829
		     "new_index file. Check that disk is not full and quota is\n"
1830
		     "not exceeded, and then \"git reset HEAD\" to recover."));
K
Kristian Høgsberg 已提交
1831

1832
	rerere(0);
1833
	run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
1834
	if (amend && !no_post_rewrite) {
1835 1836 1837
		struct notes_rewrite_cfg *cfg;
		cfg = init_copy_notes_for_rewrite("amend");
		if (cfg) {
1838 1839
			/* we are amending, so current_head is not NULL */
			copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1840
			finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1841
		}
1842
		run_rewrite_hook(current_head->object.sha1, sha1);
1843
	}
K
Kristian Høgsberg 已提交
1844
	if (!quiet)
1845
		print_summary(prefix, sha1, !current_head);
K
Kristian Høgsberg 已提交
1846

1847
	strbuf_release(&err);
K
Kristian Høgsberg 已提交
1848 1849
	return 0;
}