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

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

62
static const char empty_cherry_pick_advice[] =
J
Junio C Hamano 已提交
63
N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
64 65 66
"If you wish to commit it anyway, use:\n"
"\n"
"    git commit --allow-empty\n"
67 68 69 70 71 72 73
"\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"
74
"\n"
75 76 77 78
"    git reset\n"
"\n"
"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
"the remaining commits.\n");
79 80

static const char *use_message_buffer;
K
Kristian Høgsberg 已提交
81
static const char commit_editmsg[] = "COMMIT_EDITMSG";
82 83 84 85 86
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,
87
	COMMIT_PARTIAL
88
} commit_style;
K
Kristian Høgsberg 已提交
89

90
static const char *logfile, *force_author;
91
static const char *template_file;
92 93 94 95 96
/*
 * 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 已提交
97
static char *edit_message, *use_message;
98
static char *fixup_message, *squash_message;
J
Junio C Hamano 已提交
99 100
static int all, also, interactive, patch_interactive, only, amend, signoff;
static int edit_flag = -1; /* unspecified */
101
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
102
static int no_post_rewrite, allow_empty_message;
103
static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
J
Junio C Hamano 已提交
104 105
static char *sign_commit;

106 107 108 109 110 111 112 113 114 115
/*
 * 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,
116
	CLEANUP_SCISSORS,
117
	CLEANUP_ALL
118
} cleanup_mode;
119
static const char *cleanup_arg;
K
Kristian Høgsberg 已提交
120

121
static enum commit_whence whence;
122
static int sequencer_in_use;
123
static int use_editor = 1, include_status = 1;
124
static int show_ignored_in_status, have_option_m;
125
static const char *only_include_assumed;
126
static struct strbuf message = STRBUF_INIT;
127

128
static enum status_format {
129
	STATUS_FORMAT_NONE = 0,
130 131
	STATUS_FORMAT_LONG,
	STATUS_FORMAT_SHORT,
132 133 134 135
	STATUS_FORMAT_PORCELAIN,

	STATUS_FORMAT_UNSPECIFIED
} status_format = STATUS_FORMAT_UNSPECIFIED;
136

137 138 139
static int opt_parse_m(const struct option *opt, const char *arg, int unset)
{
	struct strbuf *buf = opt->value;
140 141
	if (unset) {
		have_option_m = 0;
142
		strbuf_setlen(buf, 0);
143 144
	} else {
		have_option_m = 1;
145 146
		if (buf->len)
			strbuf_addch(buf, '\n');
147
		strbuf_addstr(buf, arg);
148
		strbuf_complete_line(buf);
149 150 151
	}
	return 0;
}
K
Kristian Høgsberg 已提交
152

153 154 155 156
static void determine_whence(struct wt_status *s)
{
	if (file_exists(git_path("MERGE_HEAD")))
		whence = FROM_MERGE;
157
	else if (file_exists(git_path("CHERRY_PICK_HEAD"))) {
158
		whence = FROM_CHERRY_PICK;
159 160 161
		if (file_exists(git_path("sequencer")))
			sequencer_in_use = 1;
	}
162 163 164 165 166 167
	else
		whence = FROM_COMMIT;
	if (s)
		s->whence = whence;
}

168 169 170 171 172 173
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);
174
	s->hints = advice_status_hints; /* must come after git_config() */
175 176
}

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

192
static int commit_index_files(void)
193
{
194 195
	int err = 0;

196 197 198 199
	switch (commit_style) {
	case COMMIT_AS_IS:
		break; /* nothing to do */
	case COMMIT_NORMAL:
200
		err = commit_lock_file(&index_lock);
201 202
		break;
	case COMMIT_PARTIAL:
203
		err = commit_lock_file(&index_lock);
204 205 206
		rollback_lock_file(&false_lock);
		break;
	}
207 208

	return err;
209 210 211 212 213 214
}

/*
 * 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.
 */
215
static int list_paths(struct string_list *list, const char *with_tree,
216
		      const char *prefix, const struct pathspec *pattern)
217 218 219 220
{
	int i;
	char *m;

221
	if (!pattern->nr)
222 223
		return 0;

224
	m = xcalloc(1, pattern->nr);
225

226
	if (with_tree) {
227
		char *max_prefix = common_prefix(pattern);
228 229
		overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
		free(max_prefix);
230
	}
231 232

	for (i = 0; i < active_nr; i++) {
233
		const struct cache_entry *ce = active_cache[i];
234 235
		struct string_list_item *item;

236
		if (ce->ce_flags & CE_UPDATE)
237
			continue;
238
		if (!ce_path_match(ce, pattern, m))
239
			continue;
240
		item = string_list_insert(list, ce->name);
241 242
		if (ce_skip_worktree(ce))
			item->util = item; /* better a valid pointer than a fake one */
243 244
	}

245
	return report_path_error(m, pattern, prefix);
246 247
}

248
static void add_remove_files(struct string_list *list)
249 250 251
{
	int i;
	for (i = 0; i < list->nr; i++) {
252
		struct stat st;
253
		struct string_list_item *p = &(list->items[i]);
254

255 256
		/* p->util is skip-worktree */
		if (p->util)
257
			continue;
258

259 260
		if (!lstat(p->string, &st)) {
			if (add_to_cache(p->string, &st, 0))
261
				die(_("updating files failed"));
262
		} else
263
			remove_file_from_cache(p->string);
264 265 266
	}
}

267
static void create_base_index(const struct commit *current_head)
268 269 270 271 272
{
	struct tree *tree;
	struct unpack_trees_options opts;
	struct tree_desc t;

273
	if (!current_head) {
274 275 276 277 278 279 280 281
		discard_cache();
		return;
	}

	memset(&opts, 0, sizeof(opts));
	opts.head_idx = 1;
	opts.index_only = 1;
	opts.merge = 1;
282 283
	opts.src_index = &the_index;
	opts.dst_index = &the_index;
284 285

	opts.fn = oneway_merge;
286
	tree = parse_tree_indirect(current_head->object.sha1);
287
	if (!tree)
288
		die(_("failed to unpack HEAD tree object"));
289 290
	parse_tree(tree);
	init_tree_desc(&t, tree->buffer, tree->size);
291 292
	if (unpack_trees(1, &t, &opts))
		exit(128); /* We've already reported the error, finish dying */
293 294
}

295 296 297 298 299 300 301 302 303 304
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");
}

305 306
static char *prepare_index(int argc, const char **argv, const char *prefix,
			   const struct commit *current_head, int is_status)
K
Kristian Høgsberg 已提交
307
{
308
	struct string_list partial;
309
	struct pathspec pathspec;
310
	int refresh_flags = REFRESH_QUIET;
K
Kristian Høgsberg 已提交
311

312 313
	if (is_status)
		refresh_flags |= REFRESH_UNMERGED;
314 315 316
	parse_pathspec(&pathspec, 0,
		       PATHSPEC_PREFER_FULL,
		       prefix, argv);
K
Kristian Høgsberg 已提交
317

318
	if (read_cache_preload(&pathspec) < 0)
319
		die(_("index file corrupt"));
L
Linus Torvalds 已提交
320

321
	if (interactive) {
322
		char *old_index_env = NULL;
323
		hold_locked_index(&index_lock, 1);
324 325 326

		refresh_cache_or_die(refresh_flags);

327
		if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
328 329 330 331 332
			die(_("unable to create temporary index"));

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

333
		if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
334 335 336 337 338 339 340 341 342 343 344 345 346 347
			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;
	}

348 349 350 351 352 353 354 355 356 357 358 359
	/*
	 * 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.
	 */
360
	if (all || (also && pathspec.nr)) {
361
		hold_locked_index(&index_lock, 1);
362
		add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
363
		refresh_cache_or_die(refresh_flags);
364
		update_main_cache_tree(WRITE_TREE_SILENT);
365
		if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
366
			die(_("unable to write new_index file"));
367 368
		commit_style = COMMIT_NORMAL;
		return index_lock.filename;
K
Kristian Høgsberg 已提交
369 370
	}

371 372 373 374 375
	/*
	 * As-is commit.
	 *
	 * (1) return the name of the real index file.
	 *
376 377
	 * The caller should run hooks on the real index,
	 * and create commit from the_index.
378 379
	 * We still need to refresh the index here.
	 */
380
	if (!only && !pathspec.nr) {
381
		hold_locked_index(&index_lock, 1);
382
		refresh_cache_or_die(refresh_flags);
383
		if (active_cache_changed) {
384
			update_main_cache_tree(WRITE_TREE_SILENT);
385 386
			if (write_locked_index(&the_index, &index_lock,
					       COMMIT_LOCK))
387
				die(_("unable to write new_index file"));
388 389 390
		} else {
			rollback_lock_file(&index_lock);
		}
391
		commit_style = COMMIT_AS_IS;
K
Kristian Høgsberg 已提交
392 393 394
		return get_index_file();
	}

395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
	/*
	 * 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;

416 417 418 419 420 421
	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."));
	}
422

423
	string_list_init(&partial, 1);
424
	if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
425 426 427 428
		exit(1);

	discard_cache();
	if (read_cache() < 0)
429
		die(_("cannot read the index"));
430

431
	hold_locked_index(&index_lock, 1);
432
	add_remove_files(&partial);
433
	refresh_cache(REFRESH_QUIET);
434
	if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
435
		die(_("unable to write new_index file"));
K
Kristian Høgsberg 已提交
436

437 438 439 440
	hold_lock_file_for_update(&false_lock,
				  git_path("next-index-%"PRIuMAX,
					   (uintmax_t) getpid()),
				  LOCK_DIE_ON_ERROR);
441

442
	create_base_index(current_head);
443
	add_remove_files(&partial);
444
	refresh_cache(REFRESH_QUIET);
K
Kristian Høgsberg 已提交
445

446
	if (write_locked_index(&the_index, &false_lock, CLOSE_LOCK))
447
		die(_("unable to write temporary index file"));
448 449 450 451

	discard_cache();
	read_cache_from(false_lock.filename);

452
	return false_lock.filename;
K
Kristian Høgsberg 已提交
453 454
}

455 456
static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
		      struct wt_status *s)
K
Kristian Høgsberg 已提交
457
{
458 459
	unsigned char sha1[20];

460 461
	if (s->relative_paths)
		s->prefix = prefix;
K
Kristian Høgsberg 已提交
462 463

	if (amend) {
464 465
		s->amend = 1;
		s->reference = "HEAD^1";
K
Kristian Høgsberg 已提交
466
	}
467 468 469 470
	s->verbose = verbose;
	s->index_file = index_file;
	s->fp = fp;
	s->nowarn = nowarn;
471
	s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
K
Kristian Høgsberg 已提交
472

473
	wt_status_collect(s);
474 475 476

	switch (status_format) {
	case STATUS_FORMAT_SHORT:
477
		wt_shortstatus_print(s);
478 479
		break;
	case STATUS_FORMAT_PORCELAIN:
480
		wt_porcelain_print(s);
481
		break;
482 483 484
	case STATUS_FORMAT_UNSPECIFIED:
		die("BUG: finalize_deferred_config() should have been called");
		break;
485
	case STATUS_FORMAT_NONE:
486 487 488 489
	case STATUS_FORMAT_LONG:
		wt_status_print(s);
		break;
	}
K
Kristian Høgsberg 已提交
490

491
	return s->commitable;
K
Kristian Høgsberg 已提交
492 493
}

494
static int is_a_merge(const struct commit *current_head)
495
{
496
	return !!(current_head->parents && current_head->parents->next);
497 498
}

499 500 501 502 503 504 505 506 507 508
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);
}

509 510 511 512 513 514 515 516 517 518 519 520 521 522
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;
}

523
static int parse_force_date(const char *in, struct strbuf *out)
524
{
525
	strbuf_addch(out, '@');
526

527
	if (parse_date(in, out) < 0) {
528 529 530 531
		int errors = 0;
		unsigned long t = approxidate_careful(in, &errors);
		if (errors)
			return -1;
532
		strbuf_addf(out, "%lu", t);
533 534 535 536 537
	}

	return 0;
}

538
static void determine_author_info(struct strbuf *author_ident)
539 540
{
	char *name, *email, *date;
541
	struct ident_split author;
542
	struct strbuf date_buf = STRBUF_INIT;
543 544 545 546 547

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

548
	if (author_message) {
549
		struct ident_split ident;
550
		size_t len;
551
		const char *a;
552

553
		a = find_commit_header(author_message_buffer, "author", &len);
554
		if (!a)
555 556 557 558 559 560 561 562 563 564 565 566 567 568
			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);

		name = xmemdupz(ident.name_begin, ident.name_end - ident.name_begin);
		email = xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin);
		if (ident.date_begin) {
			strbuf_reset(&date_buf);
			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);
			date = date_buf.buf;
		}
569 570 571
	}

	if (force_author) {
572
		struct ident_split ident;
573

574
		if (split_ident_line(&ident, force_author, strlen(force_author)) < 0)
575
			die(_("malformed --author parameter"));
576 577
		name = xmemdupz(ident.name_begin, ident.name_end - ident.name_begin);
		email = xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin);
578 579
	}

580
	if (force_date) {
581 582
		strbuf_reset(&date_buf);
		if (parse_force_date(force_date, &date_buf))
583
			die(_("invalid date format: %s"), force_date);
584
		date = date_buf.buf;
585 586
	}

587
	strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
588 589
	if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
	    sane_ident_split(&author)) {
590 591 592 593
		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, '@');
	}
594 595

	strbuf_release(&date_buf);
596 597
}

598
static void split_ident_or_die(struct ident_split *id, const struct strbuf *buf)
599
{
600 601 602
	if (split_ident_line(id, buf->buf, buf->len) ||
	    !sane_ident_split(id))
		die(_("Malformed ident string: '%s'"), buf->buf);
603 604
}

605 606 607
static int author_date_is_interesting(void)
{
	return author_message || force_date;
608 609
}

610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639
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;
}

640
static int prepare_to_commit(const char *index_file, const char *prefix,
641
			     struct commit *current_head,
642 643
			     struct wt_status *s,
			     struct strbuf *author_ident)
K
Kristian Høgsberg 已提交
644 645
{
	struct stat statbuf;
646
	struct strbuf committer_ident = STRBUF_INIT;
647
	int commitable;
648
	struct strbuf sb = STRBUF_INIT;
649 650
	const char *hook_arg1 = NULL;
	const char *hook_arg2 = NULL;
651
	int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
652
	int old_display_comment_prefix;
K
Kristian Høgsberg 已提交
653

654 655 656
	/* This checks and barfs if author is badly specified */
	determine_author_info(author_ident);

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

660 661 662 663 664 665 666 667 668 669 670 671
	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)
672
				die(_("could not lookup commit %s"), squash_message);
673 674 675 676 677 678
			ctx.output_encoding = get_commit_output_encoding();
			format_commit_message(c, "squash! %s\n\n", &sb,
					      &ctx);
		}
	}

679 680
	if (message.len) {
		strbuf_addbuf(&sb, &message);
681
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
682 683
	} else if (logfile && !strcmp(logfile, "-")) {
		if (isatty(0))
684
			fprintf(stderr, _("(reading log message from standard input)\n"));
K
Kristian Høgsberg 已提交
685
		if (strbuf_read(&sb, 0, 0) < 0)
686
			die_errno(_("could not read log from standard input"));
687
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
688 689
	} else if (logfile) {
		if (strbuf_read_file(&sb, logfile, 0) < 0)
690
			die_errno(_("could not read log file '%s'"),
691
				  logfile);
692
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
693
	} else if (use_message) {
694
		char *buffer;
K
Kristian Høgsberg 已提交
695
		buffer = strstr(use_message_buffer, "\n\n");
696
		if (buffer)
697
			strbuf_addstr(&sb, buffer + 2);
698 699
		hook_arg1 = "commit";
		hook_arg2 = use_message;
700 701 702 703 704
	} else if (fixup_message) {
		struct pretty_print_context ctx = {0};
		struct commit *commit;
		commit = lookup_commit_reference_by_name(fixup_message);
		if (!commit)
705
			die(_("could not lookup commit %s"), fixup_message);
706 707 708 709
		ctx.output_encoding = get_commit_output_encoding();
		format_commit_message(commit, "fixup! %s\n\n",
				      &sb, &ctx);
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
710 711
	} else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
		if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
712
			die_errno(_("could not read MERGE_MSG"));
713
		hook_arg1 = "merge";
K
Kristian Høgsberg 已提交
714 715
	} else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
		if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
716
			die_errno(_("could not read SQUASH_MSG"));
717
		hook_arg1 = "squash";
718
	} else if (template_file) {
K
Kristian Høgsberg 已提交
719
		if (strbuf_read_file(&sb, template_file, 0) < 0)
720
			die_errno(_("could not read '%s'"), template_file);
721
		hook_arg1 = "template";
722
		clean_message_contents = 0;
K
Kristian Høgsberg 已提交
723 724
	}

725
	/*
726 727
	 * The remaining cases don't modify the template message, but
	 * just set the argument(s) to the prepare-commit-msg hook.
728
	 */
729
	else if (whence == FROM_MERGE)
730
		hook_arg1 = "merge";
731 732 733 734
	else if (whence == FROM_CHERRY_PICK) {
		hook_arg1 = "commit";
		hook_arg2 = "CHERRY_PICK_HEAD";
	}
735

736 737 738 739 740 741 742 743 744 745
	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 = "";
	}

746 747
	s->fp = fopen(git_path(commit_editmsg), "w");
	if (s->fp == NULL)
748
		die_errno(_("could not open '%s'"), git_path(commit_editmsg));
K
Kristian Høgsberg 已提交
749

750 751 752 753
	/* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
	old_display_comment_prefix = s->display_comment_prefix;
	s->display_comment_prefix = 1;

754 755 756 757 758 759
	/*
	 * Most hints are counter-productive when the commit has
	 * already started.
	 */
	s->hints = 0;

760
	if (clean_message_contents)
761
		stripspace(&sb, 0);
K
Kristian Høgsberg 已提交
762 763

	if (signoff) {
764 765 766 767 768 769 770 771 772 773 774 775 776 777
		/*
		 * 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;
778
			if (starts_with(sb.buf + previous, "\nConflicts:\n")) {
779 780 781 782 783 784
				ignore_footer = sb.len - previous;
				break;
			}
			while (i < eol)
				i++;
			previous = eol;
785
		}
786

787
		append_signoff(&sb, ignore_footer, 0);
K
Kristian Høgsberg 已提交
788 789
	}

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

793 794
	if (auto_comment_line_char)
		adjust_comment_line_char(&sb);
K
Kristian Høgsberg 已提交
795 796
	strbuf_release(&sb);

797
	/* This checks if committer ident is explicitly given */
798
	strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
799
	if (use_editor && include_status) {
800 801
		int ident_shown = 0;
		int saved_color_setting;
802 803
		struct ident_split ci, ai;

804 805 806
		if (whence != FROM_COMMIT) {
			if (cleanup_mode == CLEANUP_SCISSORS)
				wt_status_add_cut_line(s->fp);
807
			status_printf_ln(s, GIT_COLOR_NORMAL,
808 809 810 811 812 813 814 815 816 817 818
			    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"),
819 820 821
				git_path(whence == FROM_MERGE
					 ? "MERGE_HEAD"
					 : "CHERRY_PICK_HEAD"));
822
		}
823

824
		fprintf(s->fp, "\n");
825
		if (cleanup_mode == CLEANUP_ALL)
826 827
			status_printf(s, GIT_COLOR_NORMAL,
				_("Please enter the commit message for your changes."
J
Junio C Hamano 已提交
828 829
				  " Lines starting\nwith '%c' will be ignored, and an empty"
				  " message aborts the commit.\n"), comment_line_char);
830 831
		else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
			wt_status_add_cut_line(s->fp);
832
		else /* CLEANUP_SPACE, that is. */
833 834
			status_printf(s, GIT_COLOR_NORMAL,
				_("Please enter the commit message for your changes."
J
Junio C Hamano 已提交
835 836 837 838
				  " 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);
839
		if (only_include_assumed)
840 841
			status_printf_ln(s, GIT_COLOR_NORMAL,
					"%s", only_include_assumed);
842

843 844 845 846
		split_ident_or_die(&ai, author_ident);
		split_ident_or_die(&ci, &committer_ident);

		if (ident_cmp(&ai, &ci))
847
			status_printf_ln(s, GIT_COLOR_NORMAL,
848
				_("%s"
849
				"Author:    %.*s <%.*s>"),
850
				ident_shown++ ? "" : "\n",
851 852
				(int)(ai.name_end - ai.name_begin), ai.name_begin,
				(int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
853

854 855 856 857 858 859
		if (author_date_is_interesting())
			status_printf_ln(s, GIT_COLOR_NORMAL,
				_("%s"
				"Date:      %s"),
				ident_shown++ ? "" : "\n",
				show_ident_date(&ai, DATE_NORMAL));
860

861
		if (!committer_ident_sufficiently_given())
862
			status_printf_ln(s, GIT_COLOR_NORMAL,
863
				_("%s"
864
				"Committer: %.*s <%.*s>"),
865
				ident_shown++ ? "" : "\n",
866 867
				(int)(ci.name_end - ci.name_begin), ci.name_begin,
				(int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
868 869

		if (ident_shown)
870
			status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
871

872 873
		saved_color_setting = s->use_color;
		s->use_color = 0;
874
		commitable = run_status(s->fp, index_file, prefix, 1, s);
875
		s->use_color = saved_color_setting;
876
	} else {
877
		unsigned char sha1[20];
878
		const char *parent = "HEAD";
879 880

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

883 884 885
		if (amend)
			parent = "HEAD^1";

886
		if (get_sha1(parent, sha1))
887
			commitable = !!active_nr;
888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903
		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);
		}
904
	}
905
	strbuf_release(&committer_ident);
906

907
	fclose(s->fp);
908

909 910 911 912 913 914
	/*
	 * 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 &&
915
	    !(amend && is_a_merge(current_head))) {
916
		s->display_comment_prefix = old_display_comment_prefix;
917
		run_status(stdout, index_file, prefix, 0, s);
J
Jeff King 已提交
918
		if (amend)
919
			fputs(_(empty_amend_advice), stderr);
920
		else if (whence == FROM_CHERRY_PICK) {
J
Junio C Hamano 已提交
921
			fputs(_(empty_cherry_pick_advice), stderr);
922 923 924 925 926
			if (!sequencer_in_use)
				fputs(_(empty_cherry_pick_advice_single), stderr);
			else
				fputs(_(empty_cherry_pick_advice_multi), stderr);
		}
927
		return 0;
928 929
	}

930 931 932 933 934 935 936
	/*
	 * 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);
937
	if (update_main_cache_tree(0)) {
938
		error(_("Error building trees"));
939
		return 0;
940
	}
K
Kristian Høgsberg 已提交
941

942 943
	if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
			    git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
944
		return 0;
K
Kristian Høgsberg 已提交
945

946 947
	if (use_editor) {
		char index[PATH_MAX];
948 949
		const char *env[2] = { NULL };
		env[0] =  index;
950
		snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
S
Stephan Beyer 已提交
951 952
		if (launch_editor(git_path(commit_editmsg), NULL, env)) {
			fprintf(stderr,
953
			_("Please supply the message using either -m or -F option.\n"));
S
Stephan Beyer 已提交
954 955
			exit(1);
		}
956
	}
K
Kristian Høgsberg 已提交
957

958
	if (!no_verify &&
959
	    run_commit_hook(use_editor, index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
960 961
		return 0;
	}
K
Kristian Høgsberg 已提交
962

963
	return 1;
K
Kristian Høgsberg 已提交
964 965
}

966
static int rest_is_empty(struct strbuf *sb, int start)
K
Kristian Høgsberg 已提交
967
{
968
	int i, eol;
K
Kristian Høgsberg 已提交
969 970 971 972 973 974 975 976 977 978 979
	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 &&
980
		    starts_with(sb->buf + i, sign_off_header)) {
K
Kristian Høgsberg 已提交
981 982 983 984 985 986 987 988 989 990 991
			i = eol;
			continue;
		}
		while (i < eol)
			if (!isspace(sb->buf[i++]))
				return 0;
	}

	return 1;
}

992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
/*
 * 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;
1010
	const char *start;
1011 1012 1013 1014 1015 1016 1017 1018

	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);
1019
	if (!skip_prefix(sb->buf, tmpl.buf, &start))
1020 1021 1022 1023 1024
		start = sb->buf;
	strbuf_release(&tmpl);
	return rest_is_empty(sb, start - sb->buf);
}

1025 1026 1027 1028 1029
static const char *find_author_by_nickname(const char *name)
{
	struct rev_info revs;
	struct commit *commit;
	struct strbuf buf = STRBUF_INIT;
1030
	struct string_list mailmap = STRING_LIST_INIT_NODUP;
1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
	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);
1041 1042 1043
	revs.mailmap = &mailmap;
	read_mailmap(revs.mailmap, NULL);

1044 1045 1046
	prepare_revision_walk(&revs);
	commit = get_revision(&revs);
	if (commit) {
1047 1048
		struct pretty_print_context ctx = {0};
		ctx.date_mode = DATE_NORMAL;
1049
		strbuf_release(&buf);
1050 1051
		format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
		clear_mailmap(&mailmap);
1052 1053
		return strbuf_detach(&buf, NULL);
	}
1054
	die(_("No existing author found with '%s'"), name);
1055 1056
}

1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068

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

1072 1073
static const char *read_commit_message(const char *name)
{
J
Jeff King 已提交
1074
	const char *out_enc;
1075 1076 1077 1078
	struct commit *commit;

	commit = lookup_commit_reference_by_name(name);
	if (!commit)
J
Junio C Hamano 已提交
1079
		die(_("could not lookup commit %s"), name);
1080
	out_enc = get_commit_output_encoding();
1081
	return logmsg_reencode(commit, NULL, out_enc);
1082 1083
}

1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119
/*
 * 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;
}

1120
static int parse_and_validate_options(int argc, const char *argv[],
J
Jeff King 已提交
1121
				      const struct option *options,
1122
				      const char * const usage[],
1123
				      const char *prefix,
1124
				      struct commit *current_head,
1125
				      struct wt_status *s)
K
Kristian Høgsberg 已提交
1126 1127 1128
{
	int f = 0;

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

1132 1133 1134
	if (force_author && !strchr(force_author, '>'))
		force_author = find_author_by_nickname(force_author);

1135
	if (force_author && renew_authorship)
1136
		die(_("Using both --reset-author and --author does not make sense"));
1137

1138
	if (logfile || have_option_m || use_message || fixup_message)
1139
		use_editor = 0;
J
Junio C Hamano 已提交
1140 1141
	if (0 <= edit_flag)
		use_editor = edit_flag;
K
Kristian Høgsberg 已提交
1142 1143

	/* Sanity check options */
1144
	if (amend && !current_head)
1145
		die(_("You have nothing to amend."));
1146 1147 1148 1149 1150 1151
	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."));
	}
1152
	if (fixup_message && squash_message)
1153
		die(_("Options --squash and --fixup cannot be used together"));
K
Kristian Høgsberg 已提交
1154 1155 1156 1157
	if (use_message)
		f++;
	if (edit_message)
		f++;
1158 1159
	if (fixup_message)
		f++;
K
Kristian Høgsberg 已提交
1160 1161 1162
	if (logfile)
		f++;
	if (f > 1)
1163
		die(_("Only one of -c/-C/-F/--fixup can be used."));
1164
	if (message.len && f > 0)
1165
		die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1166 1167
	if (f || message.len)
		template_file = NULL;
K
Kristian Høgsberg 已提交
1168 1169
	if (edit_message)
		use_message = edit_message;
1170
	if (amend && !use_message && !fixup_message)
K
Kristian Høgsberg 已提交
1171
		use_message = "HEAD";
1172
	if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1173
		die(_("--reset-author can be used only with -C, -c or --amend."));
K
Kristian Høgsberg 已提交
1174
	if (use_message) {
1175 1176 1177 1178 1179 1180 1181 1182 1183
		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 已提交
1184 1185
	}

1186 1187 1188
	if (patch_interactive)
		interactive = 1;

1189
	if (also + only + all + interactive > 1)
1190
		die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
K
Kristian Høgsberg 已提交
1191
	if (argc == 0 && (also || (only && !amend)))
1192
		die(_("No paths with --include/--only does not make sense."));
K
Kristian Høgsberg 已提交
1193
	if (argc == 0 && only && amend)
1194
		only_include_assumed = _("Clever... amending the last one with dirty index.");
1195
	if (argc > 0 && !also && !only)
1196
		only_include_assumed = _("Explicit paths specified without -i or -o; assuming --only paths...");
1197 1198 1199 1200 1201 1202 1203 1204
	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;
1205 1206
	else if (!strcmp(cleanup_arg, "scissors"))
		cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
1207
	else
1208
		die(_("Invalid cleanup mode %s"), cleanup_arg);
K
Kristian Høgsberg 已提交
1209

1210
	handle_untracked_files_arg(s);
1211

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

1215
	if (status_format != STATUS_FORMAT_NONE)
1216 1217
		dry_run = 1;

K
Kristian Høgsberg 已提交
1218 1219 1220
	return argc;
}

1221
static int dry_run_commit(int argc, const char **argv, const char *prefix,
1222
			  const struct commit *current_head, struct wt_status *s)
K
Kristian Høgsberg 已提交
1223 1224
{
	int commitable;
J
Junio C Hamano 已提交
1225
	const char *index_file;
K
Kristian Høgsberg 已提交
1226

1227
	index_file = prepare_index(argc, argv, prefix, current_head, 1);
1228
	commitable = run_status(stdout, index_file, prefix, 0, s);
J
Junio C Hamano 已提交
1229
	rollback_index_files();
K
Kristian Høgsberg 已提交
1230

J
Junio C Hamano 已提交
1231 1232 1233
	return commitable ? 0 : 1;
}

1234 1235 1236 1237
static int parse_status_slot(const char *var, int offset)
{
	if (!strcasecmp(var+offset, "header"))
		return WT_STATUS_HEADER;
1238 1239
	if (!strcasecmp(var+offset, "branch"))
		return WT_STATUS_ONBRANCH;
1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
	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 已提交
1251
	return -1;
1252 1253 1254 1255 1256 1257
}

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

1258
	if (starts_with(k, "column."))
J
Jeff King 已提交
1259
		return git_column_config(k, v, "status", &s->colopts);
1260 1261 1262 1263 1264 1265 1266
	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;
	}
1267 1268
	if (!strcmp(k, "status.short")) {
		if (git_config_bool(k, v))
1269
			status_deferred_config.status_format = STATUS_FORMAT_SHORT;
1270
		else
1271
			status_deferred_config.status_format = STATUS_FORMAT_NONE;
1272 1273
		return 0;
	}
1274
	if (!strcmp(k, "status.branch")) {
1275
		status_deferred_config.show_branch = git_config_bool(k, v);
1276 1277
		return 0;
	}
1278
	if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1279
		s->use_color = git_config_colorbool(k, v);
1280 1281
		return 0;
	}
1282 1283 1284 1285
	if (!strcmp(k, "status.displaycommentprefix")) {
		s->display_comment_prefix = git_config_bool(k, v);
		return 0;
	}
1286
	if (starts_with(k, "status.color.") || starts_with(k, "color.status.")) {
1287
		int slot = parse_status_slot(k, 13);
J
Jeff King 已提交
1288 1289
		if (slot < 0)
			return 0;
1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308
		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
1309
			return error(_("Invalid untracked files mode '%s'"), v);
1310 1311 1312 1313 1314
		return 0;
	}
	return git_diff_ui_config(k, v, NULL);
}

J
Junio C Hamano 已提交
1315 1316
int cmd_status(int argc, const char **argv, const char *prefix)
{
J
Jeff King 已提交
1317
	static struct wt_status s;
1318
	int fd;
1319
	unsigned char sha1[20];
1320
	static struct option builtin_status_options[] = {
1321
		OPT__VERBOSE(&verbose, N_("be verbose")),
1322
		OPT_SET_INT('s', "short", &status_format,
1323
			    N_("show status concisely"), STATUS_FORMAT_SHORT),
1324 1325
		OPT_BOOL('b', "branch", &s.show_branch,
			 N_("show branch information")),
1326
		OPT_SET_INT(0, "porcelain", &status_format,
1327
			    N_("machine-readable output"),
1328
			    STATUS_FORMAT_PORCELAIN),
1329 1330 1331
		OPT_SET_INT(0, "long", &status_format,
			    N_("show status in long format (default)"),
			    STATUS_FORMAT_LONG),
1332 1333
		OPT_BOOL('z', "null", &s.null_termination,
			 N_("terminate entries with NUL")),
1334
		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1335 1336
		  N_("mode"),
		  N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
1337
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1338 1339
		OPT_BOOL(0, "ignored", &show_ignored_in_status,
			 N_("show ignored files")),
1340 1341
		{ OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
		  N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
1342
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1343
		OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
1344 1345 1346
		OPT_END(),
	};

1347 1348 1349
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_status_usage, builtin_status_options);

1350
	status_init_config(&s, git_status_config);
1351
	argc = parse_options(argc, argv, prefix,
1352 1353
			     builtin_status_options,
			     builtin_status_usage, 0);
J
Jeff King 已提交
1354
	finalize_colopts(&s.colopts, -1);
1355
	finalize_deferred_config(&s);
1356

1357
	handle_untracked_files_arg(&s);
1358 1359
	if (show_ignored_in_status)
		s.show_ignored_files = 1;
1360 1361 1362
	parse_pathspec(&s.pathspec, 0,
		       PATHSPEC_PREFER_FULL,
		       prefix, argv);
1363

1364
	read_cache_preload(&s.pathspec);
1365
	refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
1366 1367

	fd = hold_locked_index(&index_lock, 0);
1368 1369
	if (0 <= fd)
		update_index_if_able(&the_index, &index_lock);
1370

1371
	s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1372
	s.ignore_submodule_arg = ignore_submodule_arg;
1373 1374
	wt_status_collect(&s);

J
Jeff King 已提交
1375 1376
	if (s.relative_paths)
		s.prefix = prefix;
1377

1378 1379
	switch (status_format) {
	case STATUS_FORMAT_SHORT:
1380
		wt_shortstatus_print(&s);
1381
		break;
1382
	case STATUS_FORMAT_PORCELAIN:
1383
		wt_porcelain_print(&s);
1384
		break;
1385 1386 1387
	case STATUS_FORMAT_UNSPECIFIED:
		die("BUG: finalize_deferred_config() should have been called");
		break;
1388
	case STATUS_FORMAT_NONE:
1389
	case STATUS_FORMAT_LONG:
1390
		s.verbose = verbose;
1391
		s.ignore_submodule_arg = ignore_submodule_arg;
1392
		wt_status_print(&s);
1393
		break;
1394
	}
1395
	return 0;
K
Kristian Høgsberg 已提交
1396 1397
}

1398 1399
static void print_summary(const char *prefix, const unsigned char *sha1,
			  int initial_commit)
K
Kristian Høgsberg 已提交
1400 1401 1402
{
	struct rev_info rev;
	struct commit *commit;
1403
	struct strbuf format = STRBUF_INIT;
J
Jeff King 已提交
1404
	unsigned char junk_sha1[20];
1405
	const char *head;
1406 1407 1408
	struct pretty_print_context pctx = {0};
	struct strbuf author_ident = STRBUF_INIT;
	struct strbuf committer_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1409 1410 1411

	commit = lookup_commit(sha1);
	if (!commit)
1412
		die(_("couldn't look up newly created commit"));
1413
	if (parse_commit(commit))
1414
		die(_("could not parse newly created commit"));
K
Kristian Høgsberg 已提交
1415

1416 1417 1418 1419 1420 1421 1422 1423
	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);
	}
1424 1425 1426 1427 1428 1429 1430
	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);
	}
1431
	if (!committer_ident_sufficiently_given()) {
1432 1433
		strbuf_addstr(&format, "\n Committer: ");
		strbuf_addbuf_percentquote(&format, &committer_ident);
1434 1435
		if (advice_implicit_identity) {
			strbuf_addch(&format, '\n');
1436
			strbuf_addstr(&format, _(implicit_ident_advice));
1437
		}
1438 1439 1440 1441
	}
	strbuf_release(&author_ident);
	strbuf_release(&committer_ident);

K
Kristian Høgsberg 已提交
1442 1443 1444 1445 1446 1447 1448 1449 1450
	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;
1451
	get_commit_format(format.buf, &rev);
1452
	rev.always_show_header = 0;
1453 1454
	rev.diffopt.detect_rename = 1;
	rev.diffopt.break_opt = 0;
1455
	diff_setup_done(&rev.diffopt);
K
Kristian Høgsberg 已提交
1456

1457
	head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1458
	printf("[%s%s ",
1459
		starts_with(head, "refs/heads/") ?
J
Jeff King 已提交
1460 1461
			head + 11 :
			!strcmp(head, "HEAD") ?
1462
				_("detached HEAD") :
J
Jeff King 已提交
1463
				head,
1464
		initial_commit ? _(" (root-commit)") : "");
K
Kristian Høgsberg 已提交
1465

1466
	if (!log_tree_commit(&rev, commit)) {
1467 1468 1469
		rev.always_show_header = 1;
		rev.use_terminator = 1;
		log_tree_commit(&rev, commit);
1470
	}
1471

1472
	strbuf_release(&format);
K
Kristian Høgsberg 已提交
1473 1474
}

1475
static int git_commit_config(const char *k, const char *v, void *cb)
K
Kristian Høgsberg 已提交
1476
{
1477
	struct wt_status *s = cb;
J
Junio C Hamano 已提交
1478
	int status;
1479

1480
	if (!strcmp(k, "commit.template"))
1481
		return git_config_pathname(&template_file, k, v);
1482 1483 1484 1485
	if (!strcmp(k, "commit.status")) {
		include_status = git_config_bool(k, v);
		return 0;
	}
1486 1487
	if (!strcmp(k, "commit.cleanup"))
		return git_config_string(&cleanup_arg, k, v);
1488 1489 1490 1491
	if (!strcmp(k, "commit.gpgsign")) {
		sign_commit = git_config_bool(k, v) ? "" : NULL;
		return 0;
	}
K
Kristian Høgsberg 已提交
1492

J
Junio C Hamano 已提交
1493 1494 1495
	status = git_gpg_config(k, v, NULL);
	if (status)
		return status;
1496
	return git_status_config(k, v, s);
K
Kristian Høgsberg 已提交
1497 1498
}

1499 1500 1501 1502 1503 1504 1505 1506 1507 1508
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;

1509 1510
	argv[0] = find_hook("post-rewrite");
	if (!argv[0])
1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530
		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);
}

1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553
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 已提交
1554 1555
int cmd_commit(int argc, const char **argv, const char *prefix)
{
J
Jeff King 已提交
1556 1557
	static struct wt_status s;
	static struct option builtin_commit_options[] = {
1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569
		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")),
1570 1571
		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:")),
1572 1573 1574
		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")),
1575
		OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
1576
		{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
1577
		  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
J
Jeff King 已提交
1578 1579
		/* end commit message options */

1580
		OPT_GROUP(N_("Commit contents options")),
1581 1582 1583 1584 1585 1586 1587
		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")),
1588
		OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
J
Jeff King 已提交
1589
			    STATUS_FORMAT_SHORT),
1590
		OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
J
Jeff King 已提交
1591
		OPT_SET_INT(0, "porcelain", &status_format,
1592
			    N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
1593 1594 1595
		OPT_SET_INT(0, "long", &status_format,
			    N_("show status in long format (default)"),
			    STATUS_FORMAT_LONG),
1596 1597 1598 1599
		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")),
1600
		{ 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 已提交
1601 1602
		/* end commit contents options */

1603 1604 1605 1606
		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 已提交
1607 1608 1609 1610

		OPT_END()
	};

1611
	struct strbuf sb = STRBUF_INIT;
1612
	struct strbuf author_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1613
	const char *index_file, *reflog_msg;
1614
	char *nl;
1615
	unsigned char sha1[20];
K
Kristian Høgsberg 已提交
1616
	struct ref_lock *ref_lock;
M
Miklos Vajna 已提交
1617
	struct commit_list *parents = NULL, **pptr = &parents;
1618
	struct stat statbuf;
1619
	struct commit *current_head = NULL;
1620
	struct commit_extra_header *extra = NULL;
K
Kristian Høgsberg 已提交
1621

1622 1623 1624
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_commit_usage, builtin_commit_options);

1625
	status_init_config(&s, git_commit_config);
1626
	status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
J
Jeff King 已提交
1627
	s.colopts = 0;
K
Kristian Høgsberg 已提交
1628

1629 1630 1631
	if (get_sha1("HEAD", sha1))
		current_head = NULL;
	else {
1632
		current_head = lookup_commit_or_die(sha1, "HEAD");
1633
		if (parse_commit(current_head))
1634 1635
			die(_("could not parse HEAD commit"));
	}
J
Jeff King 已提交
1636 1637
	argc = parse_and_validate_options(argc, argv, builtin_commit_options,
					  builtin_commit_usage,
1638
					  prefix, current_head, &s);
1639
	if (dry_run)
1640 1641
		return dry_run_commit(argc, argv, prefix, current_head, &s);
	index_file = prepare_index(argc, argv, prefix, current_head, 0);
K
Kristian Høgsberg 已提交
1642

1643 1644
	/* Set up everything for writing the commit object.  This includes
	   running hooks, writing the trees, and interacting with the user.  */
1645 1646
	if (!prepare_to_commit(index_file, prefix,
			       current_head, &s, &author_ident)) {
1647
		rollback_index_files();
K
Kristian Høgsberg 已提交
1648 1649 1650 1651
		return 1;
	}

	/* Determine parents */
1652
	reflog_msg = getenv("GIT_REFLOG_ACTION");
1653
	if (!current_head) {
1654 1655
		if (!reflog_msg)
			reflog_msg = "commit (initial)";
K
Kristian Høgsberg 已提交
1656 1657 1658
	} else if (amend) {
		struct commit_list *c;

1659 1660
		if (!reflog_msg)
			reflog_msg = "commit (amend)";
1661
		for (c = current_head->parents; c; c = c->next)
M
Miklos Vajna 已提交
1662
			pptr = &commit_list_insert(c->item, pptr)->next;
1663
	} else if (whence == FROM_MERGE) {
1664
		struct strbuf m = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1665
		FILE *fp;
1666
		int allow_fast_forward = 1;
K
Kristian Høgsberg 已提交
1667

1668 1669
		if (!reflog_msg)
			reflog_msg = "commit (merge)";
1670
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1671 1672
		fp = fopen(git_path("MERGE_HEAD"), "r");
		if (fp == NULL)
1673
			die_errno(_("could not open '%s' for reading"),
1674
				  git_path("MERGE_HEAD"));
1675
		while (strbuf_getline(&m, fp, '\n') != EOF) {
1676 1677 1678 1679
			struct commit *parent;

			parent = get_merge_parent(m.buf);
			if (!parent)
1680
				die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1681
			pptr = &commit_list_insert(parent, pptr)->next;
1682
		}
K
Kristian Høgsberg 已提交
1683 1684
		fclose(fp);
		strbuf_release(&m);
1685 1686
		if (!stat(git_path("MERGE_MODE"), &statbuf)) {
			if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1687
				die_errno(_("could not read MERGE_MODE"));
1688 1689 1690 1691 1692
			if (!strcmp(sb.buf, "no-ff"))
				allow_fast_forward = 0;
		}
		if (allow_fast_forward)
			parents = reduce_heads(parents);
K
Kristian Høgsberg 已提交
1693
	} else {
1694
		if (!reflog_msg)
1695 1696 1697
			reflog_msg = (whence == FROM_CHERRY_PICK)
					? "commit (cherry-pick)"
					: "commit";
1698
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1699 1700
	}

1701
	/* Finally, get the commit message */
1702
	strbuf_reset(&sb);
1703
	if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1704
		int saved_errno = errno;
1705
		rollback_index_files();
1706
		die(_("could not read commit message: %s"), strerror(saved_errno));
1707
	}
1708

1709 1710
	if (verbose || /* Truncate the message just before the diff, if any. */
	    cleanup_mode == CLEANUP_SCISSORS)
1711
		wt_status_truncate_message_at_cut_line(&sb);
1712

1713 1714
	if (cleanup_mode != CLEANUP_NONE)
		stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1715 1716 1717 1718 1719
	if (template_untouched(&sb) && !allow_empty_message) {
		rollback_index_files();
		fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
		exit(1);
	}
1720
	if (message_is_empty(&sb) && !allow_empty_message) {
1721
		rollback_index_files();
1722
		fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
J
Jeff King 已提交
1723
		exit(1);
1724
	}
K
Kristian Høgsberg 已提交
1725

1726
	if (amend) {
1727 1728
		const char *exclude_gpgsig[2] = { "gpgsig", NULL };
		extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1729 1730 1731 1732
	} else {
		struct commit_extra_header **tail = &extra;
		append_merge_tag_headers(parents, &tail);
	}
1733

1734 1735
	if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->sha1,
			 parents, sha1, author_ident.buf, sign_commit, extra)) {
1736
		rollback_index_files();
1737
		die(_("failed to write commit object"));
1738
	}
1739
	strbuf_release(&author_ident);
1740
	free_commit_extra_headers(extra);
K
Kristian Høgsberg 已提交
1741 1742

	ref_lock = lock_any_ref_for_update("HEAD",
1743 1744 1745
					   !current_head
					   ? NULL
					   : current_head->object.sha1,
1746
					   0, NULL);
1747 1748 1749 1750
	if (!ref_lock) {
		rollback_index_files();
		die(_("cannot lock HEAD ref"));
	}
K
Kristian Høgsberg 已提交
1751

M
Miklos Vajna 已提交
1752
	nl = strchr(sb.buf, '\n');
1753 1754 1755 1756 1757 1758
	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 已提交
1759

1760
	if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1761
		rollback_index_files();
1762
		die(_("cannot update HEAD ref"));
1763
	}
K
Kristian Høgsberg 已提交
1764

J
Jay Soffian 已提交
1765
	unlink(git_path("CHERRY_PICK_HEAD"));
1766
	unlink(git_path("REVERT_HEAD"));
K
Kristian Høgsberg 已提交
1767 1768
	unlink(git_path("MERGE_HEAD"));
	unlink(git_path("MERGE_MSG"));
1769
	unlink(git_path("MERGE_MODE"));
1770
	unlink(git_path("SQUASH_MSG"));
K
Kristian Høgsberg 已提交
1771

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

1777
	rerere(0);
1778
	run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
1779
	if (amend && !no_post_rewrite) {
1780 1781 1782
		struct notes_rewrite_cfg *cfg;
		cfg = init_copy_notes_for_rewrite("amend");
		if (cfg) {
1783 1784
			/* we are amending, so current_head is not NULL */
			copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1785
			finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1786
		}
1787
		run_rewrite_hook(current_head->object.sha1, sha1);
1788
	}
K
Kristian Høgsberg 已提交
1789
	if (!quiet)
1790
		print_summary(prefix, sha1, !current_head);
K
Kristian Høgsberg 已提交
1791 1792 1793

	return 0;
}