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

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

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

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

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

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

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

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

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

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

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

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

	STATUS_FORMAT_UNSPECIFIED
} status_format = STATUS_FORMAT_UNSPECIFIED;
123

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

140 141 142 143 144 145 146 147 148 149 150 151
static void determine_whence(struct wt_status *s)
{
	if (file_exists(git_path("MERGE_HEAD")))
		whence = FROM_MERGE;
	else if (file_exists(git_path("CHERRY_PICK_HEAD")))
		whence = FROM_CHERRY_PICK;
	else
		whence = FROM_COMMIT;
	if (s)
		s->whence = whence;
}

152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
static void rollback_index_files(void)
{
	switch (commit_style) {
	case COMMIT_AS_IS:
		break; /* nothing to do */
	case COMMIT_NORMAL:
		rollback_lock_file(&index_lock);
		break;
	case COMMIT_PARTIAL:
		rollback_lock_file(&index_lock);
		rollback_lock_file(&false_lock);
		break;
	}
}

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

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

	return err;
184 185 186 187 188 189
}

/*
 * Take a union of paths in the index and the named tree (typically, "HEAD"),
 * and return the paths that match the given pattern in list.
 */
190
static int list_paths(struct string_list *list, const char *with_tree,
191
		      const char *prefix, const struct pathspec *pattern)
192 193 194 195
{
	int i;
	char *m;

196
	if (!pattern->nr)
197 198
		return 0;

199
	m = xcalloc(1, pattern->nr);
200

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

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

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

220
	return report_path_error(m, pattern, prefix);
221 222
}

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

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

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

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

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

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

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

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

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

289 290
	if (is_status)
		refresh_flags |= REFRESH_UNMERGED;
291 292 293
	parse_pathspec(&pathspec, 0,
		       PATHSPEC_PREFER_FULL,
		       prefix, argv);
K
Kristian Høgsberg 已提交
294

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

298 299 300 301 302 303 304 305 306 307 308 309
	if (interactive) {
		fd = hold_locked_index(&index_lock, 1);

		refresh_cache_or_die(refresh_flags);

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

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

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

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

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

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

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

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

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

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

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

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

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

	discard_cache();
	read_cache_from(false_lock.filename);

433
	return false_lock.filename;
K
Kristian Høgsberg 已提交
434 435
}

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

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

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

454
	wt_status_collect(s);
455 456 457

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

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

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

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

490 491 492 493 494 495 496 497 498 499 500 501 502 503
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;
}

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

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

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

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

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

527 528 529 530 531 532 533 534 535
		if (lb == a + strlen("\nauthor "))
			/* \nauthor <foo@example.com> */
			name = xcalloc(1, 1);
		else
			name = xmemdupz(a + strlen("\nauthor "),
					(lb - strlen(" ") -
					 (a + strlen("\nauthor "))));
		email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
		date = xmemdupz(rb + strlen("> "), eol - (rb + strlen("> ")));
536 537 538 539 540
		len = eol - (rb + strlen("> "));
		date = xmalloc(len + 2);
		*date = '@';
		memcpy(date + 1, rb + strlen("> "), len);
		date[len + 1] = '\0';
541 542 543 544 545 546 547
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

757 758 759
		ai_tmp = cut_ident_timestamp_part(author_ident->buf);
		ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
		if (strcmp(author_ident->buf, committer_ident.buf))
760
			status_printf_ln(s, GIT_COLOR_NORMAL,
761 762
				_("%s"
				"Author:    %s"),
763
				ident_shown++ ? "" : "\n",
764
				author_ident->buf);
765

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

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

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

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

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

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

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

800
	fclose(s->fp);
801

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

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

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

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

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

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

853
static int rest_is_empty(struct strbuf *sb, int start)
K
Kristian Høgsberg 已提交
854
{
855
	int i, eol;
K
Kristian Høgsberg 已提交
856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878
	const char *nl;

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

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

	return 1;
}

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

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

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

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

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

913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
static const char *find_author_by_nickname(const char *name)
{
	struct rev_info revs;
	struct commit *commit;
	struct strbuf buf = STRBUF_INIT;
	const char *av[20];
	int ac = 0;

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

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

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

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

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

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

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

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

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

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

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

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

1071 1072 1073
	if (patch_interactive)
		interactive = 1;

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

1093
	handle_untracked_files_arg(s);
1094

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1298 1299 1300 1301 1302 1303 1304 1305
	strbuf_addstr(&format, "format:%h] %s");

	format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
	format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
	if (strbuf_cmp(&author_ident, &committer_ident)) {
		strbuf_addstr(&format, "\n Author: ");
		strbuf_addbuf_percentquote(&format, &author_ident);
	}
1306
	if (!committer_ident_sufficiently_given()) {
1307 1308
		strbuf_addstr(&format, "\n Committer: ");
		strbuf_addbuf_percentquote(&format, &committer_ident);
1309 1310
		if (advice_implicit_identity) {
			strbuf_addch(&format, '\n');
1311
			strbuf_addstr(&format, _(implicit_ident_advice));
1312
		}
1313 1314 1315 1316
	}
	strbuf_release(&author_ident);
	strbuf_release(&committer_ident);

K
Kristian Høgsberg 已提交
1317 1318 1319 1320 1321 1322 1323 1324 1325
	init_revisions(&rev, prefix);
	setup_revisions(0, NULL, &rev, NULL);

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

	rev.verbose_header = 1;
	rev.show_root_diff = 1;
1326
	get_commit_format(format.buf, &rev);
1327
	rev.always_show_header = 0;
1328 1329
	rev.diffopt.detect_rename = 1;
	rev.diffopt.break_opt = 0;
1330
	diff_setup_done(&rev.diffopt);
K
Kristian Høgsberg 已提交
1331

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

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

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

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

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

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

1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
static int run_rewrite_hook(const unsigned char *oldsha1,
			    const unsigned char *newsha1)
{
	/* oldsha1 SP newsha1 LF NUL */
	static char buf[2*40 + 3];
	struct child_process proc;
	const char *argv[3];
	int code;
	size_t n;

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

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

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

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

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

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

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

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

		OPT_END()
	};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Miklos Vajna 已提交
1604
	nl = strchr(sb.buf, '\n');
1605 1606 1607 1608 1609 1610
	if (nl)
		strbuf_setlen(&sb, nl + 1 - sb.buf);
	else
		strbuf_addch(&sb, '\n');
	strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
	strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
K
Kristian Høgsberg 已提交
1611

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

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

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

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

	return 0;
}