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

#include "cache.h"
#include "cache-tree.h"
10
#include "color.h"
11
#include "dir.h"
K
Kristian Høgsberg 已提交
12 13 14 15 16 17 18 19 20 21 22 23
#include "builtin.h"
#include "diff.h"
#include "diffcore.h"
#include "commit.h"
#include "revision.h"
#include "wt-status.h"
#include "run-command.h"
#include "refs.h"
#include "log-tree.h"
#include "strbuf.h"
#include "utf8.h"
#include "parse-options.h"
24
#include "string-list.h"
25
#include "rerere.h"
26
#include "unpack-trees.h"
27
#include "quote.h"
28
#include "submodule.h"
K
Kristian Høgsberg 已提交
29 30

static const char * const builtin_commit_usage[] = {
S
Stephan Beyer 已提交
31
	"git commit [options] [--] <filepattern>...",
K
Kristian Høgsberg 已提交
32 33 34
	NULL
};

35
static const char * const builtin_status_usage[] = {
S
Stephan Beyer 已提交
36
	"git status [options] [--] <filepattern>...",
37 38 39
	NULL
};

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

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

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

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

75
static const char *logfile, *force_author;
76
static const char *template_file;
77 78 79 80 81
/*
 * 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 已提交
82
static char *edit_message, *use_message;
83
static char *fixup_message, *squash_message;
84
static int all, edit_flag, also, interactive, patch_interactive, only, amend, signoff;
85
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
86
static int no_post_rewrite, allow_empty_message;
87
static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
88 89 90 91 92 93 94 95 96 97
/*
 * 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,
98
	CLEANUP_ALL
99 100
} cleanup_mode;
static char *cleanup_arg;
K
Kristian Høgsberg 已提交
101

102
static enum commit_whence whence;
103
static int use_editor = 1, include_status = 1;
104
static int show_ignored_in_status;
105 106
static const char *only_include_assumed;
static struct strbuf message;
107

108 109 110 111
static int null_termination;
static enum {
	STATUS_FORMAT_LONG,
	STATUS_FORMAT_SHORT,
112
	STATUS_FORMAT_PORCELAIN
113
} status_format = STATUS_FORMAT_LONG;
114
static int status_show_branch;
115

116 117 118 119 120 121 122
static int opt_parse_m(const struct option *opt, const char *arg, int unset)
{
	struct strbuf *buf = opt->value;
	if (unset)
		strbuf_setlen(buf, 0);
	else {
		strbuf_addstr(buf, arg);
123
		strbuf_addstr(buf, "\n\n");
124 125 126
	}
	return 0;
}
K
Kristian Høgsberg 已提交
127 128

static struct option builtin_commit_options[] = {
129 130
	OPT__QUIET(&quiet, "suppress summary after successful commit"),
	OPT__VERBOSE(&verbose, "show diff in commit message template"),
K
Kristian Høgsberg 已提交
131

G
Greg Price 已提交
132
	OPT_GROUP("Commit message options"),
133
	OPT_FILENAME('F', "file", &logfile, "read message from file"),
134 135 136 137 138 139 140
	OPT_STRING(0, "author", &force_author, "author", "override author for commit"),
	OPT_STRING(0, "date", &force_date, "date", "override date for commit"),
	OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m),
	OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"),
	OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"),
	OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"),
	OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"),
141
	OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C-c/--amend)"),
142
	OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
143
	OPT_FILENAME('t', "template", &template_file, "use specified template file"),
K
Kristian Høgsberg 已提交
144
	OPT_BOOLEAN('e', "edit", &edit_flag, "force edit of commit"),
G
Greg Price 已提交
145
	OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
146
	OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
G
Greg Price 已提交
147
	/* end commit message options */
K
Kristian Høgsberg 已提交
148 149 150 151 152

	OPT_GROUP("Commit contents options"),
	OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
	OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
	OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
153
	OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"),
154
	OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
K
Kristian Høgsberg 已提交
155
	OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
J
Junio C Hamano 已提交
156
	OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
157 158
	OPT_SET_INT(0, "short", &status_format, "show status concisely",
		    STATUS_FORMAT_SHORT),
159
	OPT_BOOLEAN(0, "branch", &status_show_branch, "show branch information"),
160
	OPT_SET_INT(0, "porcelain", &status_format,
161
		    "machine-readable output", STATUS_FORMAT_PORCELAIN),
162 163
	OPT_BOOLEAN('z', "null", &null_termination,
		    "terminate entries with NUL"),
K
Kristian Høgsberg 已提交
164
	OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
165
	OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
166
	{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
G
Greg Price 已提交
167
	/* end commit contents options */
K
Kristian Høgsberg 已提交
168

169 170 171 172 173 174 175
	{ OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
	  "ok to record an empty change",
	  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
	{ OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
	  "ok to record a change with an empty message",
	  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },

K
Kristian Høgsberg 已提交
176 177 178
	OPT_END()
};

179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
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;
}

static const char *whence_s(void)
{
	char *s = "";

	switch (whence) {
	case FROM_COMMIT:
		break;
	case FROM_MERGE:
		s = "merge";
		break;
	case FROM_CHERRY_PICK:
		s = "cherry-pick";
		break;
	}

	return s;
}

209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
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;
	}
}

224
static int commit_index_files(void)
225
{
226 227
	int err = 0;

228 229 230 231
	switch (commit_style) {
	case COMMIT_AS_IS:
		break; /* nothing to do */
	case COMMIT_NORMAL:
232
		err = commit_lock_file(&index_lock);
233 234
		break;
	case COMMIT_PARTIAL:
235
		err = commit_lock_file(&index_lock);
236 237 238
		rollback_lock_file(&false_lock);
		break;
	}
239 240

	return err;
241 242 243 244 245 246
}

/*
 * 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.
 */
247
static int list_paths(struct string_list *list, const char *with_tree,
248 249 250 251 252 253 254 255 256
		      const char *prefix, const char **pattern)
{
	int i;
	char *m;

	for (i = 0; pattern[i]; i++)
		;
	m = xcalloc(1, i);

257 258 259 260
	if (with_tree) {
		const char *max_prefix = pathspec_prefix(prefix, pattern);
		overlay_tree_on_cache(with_tree, max_prefix);
	}
261 262 263

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

266
		if (ce->ce_flags & CE_UPDATE)
267
			continue;
268
		if (!match_pathspec(pattern, ce->name, ce_namelen(ce), 0, m))
269
			continue;
270
		item = string_list_insert(list, ce->name);
271 272
		if (ce_skip_worktree(ce))
			item->util = item; /* better a valid pointer than a fake one */
273 274
	}

275
	return report_path_error(m, pattern, prefix);
276 277
}

278
static void add_remove_files(struct string_list *list)
279 280 281
{
	int i;
	for (i = 0; i < list->nr; i++) {
282
		struct stat st;
283
		struct string_list_item *p = &(list->items[i]);
284

285 286
		/* p->util is skip-worktree */
		if (p->util)
287
			continue;
288

289 290
		if (!lstat(p->string, &st)) {
			if (add_to_cache(p->string, &st, 0))
291
				die(_("updating files failed"));
292
		} else
293
			remove_file_from_cache(p->string);
294 295 296
	}
}

297
static void create_base_index(const struct commit *current_head)
298 299 300 301 302
{
	struct tree *tree;
	struct unpack_trees_options opts;
	struct tree_desc t;

303
	if (!current_head) {
304 305 306 307 308 309 310 311
		discard_cache();
		return;
	}

	memset(&opts, 0, sizeof(opts));
	opts.head_idx = 1;
	opts.index_only = 1;
	opts.merge = 1;
312 313
	opts.src_index = &the_index;
	opts.dst_index = &the_index;
314 315

	opts.fn = oneway_merge;
316
	tree = parse_tree_indirect(current_head->object.sha1);
317
	if (!tree)
318
		die(_("failed to unpack HEAD tree object"));
319 320
	parse_tree(tree);
	init_tree_desc(&t, tree->buffer, tree->size);
321 322
	if (unpack_trees(1, &t, &opts))
		exit(128); /* We've already reported the error, finish dying */
323 324
}

325 326 327 328 329 330 331 332 333 334
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");
}

335 336
static char *prepare_index(int argc, const char **argv, const char *prefix,
			   const struct commit *current_head, int is_status)
K
Kristian Høgsberg 已提交
337 338
{
	int fd;
339
	struct string_list partial;
340
	const char **pathspec = NULL;
341
	char *old_index_env = NULL;
342
	int refresh_flags = REFRESH_QUIET;
K
Kristian Høgsberg 已提交
343

344 345
	if (is_status)
		refresh_flags |= REFRESH_UNMERGED;
K
Kristian Høgsberg 已提交
346

347 348
	if (*argv)
		pathspec = get_pathspec(prefix, argv);
349

L
Linus Torvalds 已提交
350
	if (read_cache_preload(pathspec) < 0)
351
		die(_("index file corrupt"));
L
Linus Torvalds 已提交
352

353 354 355 356 357 358 359 360 361 362 363 364
	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);

365
		if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
366 367 368 369 370 371 372 373 374 375 376 377 378 379
			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;
	}

380 381 382 383 384 385 386 387 388 389 390 391 392
	/*
	 * Non partial, non as-is commit.
	 *
	 * (1) get the real index;
	 * (2) update the_index as necessary;
	 * (3) write the_index out to the real index (still locked);
	 * (4) return the name of the locked index file.
	 *
	 * The caller should run hooks on the locked real index, and
	 * (A) if all goes well, commit the real index;
	 * (B) on failure, rollback the real index.
	 */
	if (all || (also && pathspec && *pathspec)) {
393
		fd = hold_locked_index(&index_lock, 1);
394
		add_files_to_cache(also ? prefix : NULL, pathspec, 0);
395
		refresh_cache_or_die(refresh_flags);
B
Brandon Casey 已提交
396 397
		if (write_cache(fd, active_cache, active_nr) ||
		    close_lock_file(&index_lock))
398
			die(_("unable to write new_index file"));
399 400
		commit_style = COMMIT_NORMAL;
		return index_lock.filename;
K
Kristian Høgsberg 已提交
401 402
	}

403 404 405 406 407
	/*
	 * As-is commit.
	 *
	 * (1) return the name of the real index file.
	 *
408 409
	 * The caller should run hooks on the real index,
	 * and create commit from the_index.
410 411 412 413
	 * We still need to refresh the index here.
	 */
	if (!pathspec || !*pathspec) {
		fd = hold_locked_index(&index_lock, 1);
414
		refresh_cache_or_die(refresh_flags);
415 416 417
		if (active_cache_changed) {
			if (write_cache(fd, active_cache, active_nr) ||
			    commit_locked_index(&index_lock))
418
				die(_("unable to write new_index file"));
419 420 421
		} else {
			rollback_lock_file(&index_lock);
		}
422
		commit_style = COMMIT_AS_IS;
K
Kristian Høgsberg 已提交
423 424 425
		return get_index_file();
	}

426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
	/*
	 * 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;

447
	if (whence != FROM_COMMIT)
J
Junio C Hamano 已提交
448
		die(_("cannot do a partial commit during a %s."), whence_s());
449 450

	memset(&partial, 0, sizeof(partial));
451
	partial.strdup_strings = 1;
452
	if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec))
453 454 455 456
		exit(1);

	discard_cache();
	if (read_cache() < 0)
457
		die(_("cannot read the index"));
458 459 460

	fd = hold_locked_index(&index_lock, 1);
	add_remove_files(&partial);
461
	refresh_cache(REFRESH_QUIET);
B
Brandon Casey 已提交
462 463
	if (write_cache(fd, active_cache, active_nr) ||
	    close_lock_file(&index_lock))
464
		die(_("unable to write new_index file"));
K
Kristian Høgsberg 已提交
465

466
	fd = hold_lock_file_for_update(&false_lock,
J
Junio C Hamano 已提交
467 468
				       git_path("next-index-%"PRIuMAX,
						(uintmax_t) getpid()),
469
				       LOCK_DIE_ON_ERROR);
470

471
	create_base_index(current_head);
472
	add_remove_files(&partial);
473
	refresh_cache(REFRESH_QUIET);
K
Kristian Høgsberg 已提交
474

B
Brandon Casey 已提交
475 476
	if (write_cache(fd, active_cache, active_nr) ||
	    close_lock_file(&false_lock))
477
		die(_("unable to write temporary index file"));
478 479 480 481

	discard_cache();
	read_cache_from(false_lock.filename);

482
	return false_lock.filename;
K
Kristian Høgsberg 已提交
483 484
}

485 486
static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
		      struct wt_status *s)
K
Kristian Høgsberg 已提交
487
{
488 489
	unsigned char sha1[20];

490 491
	if (s->relative_paths)
		s->prefix = prefix;
K
Kristian Høgsberg 已提交
492 493

	if (amend) {
494 495
		s->amend = 1;
		s->reference = "HEAD^1";
K
Kristian Høgsberg 已提交
496
	}
497 498 499 500
	s->verbose = verbose;
	s->index_file = index_file;
	s->fp = fp;
	s->nowarn = nowarn;
501
	s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
K
Kristian Høgsberg 已提交
502

503
	wt_status_collect(s);
504 505 506

	switch (status_format) {
	case STATUS_FORMAT_SHORT:
507
		wt_shortstatus_print(s, null_termination, status_show_branch);
508 509
		break;
	case STATUS_FORMAT_PORCELAIN:
510
		wt_porcelain_print(s, null_termination);
511 512 513 514 515
		break;
	case STATUS_FORMAT_LONG:
		wt_status_print(s);
		break;
	}
K
Kristian Høgsberg 已提交
516

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

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

K
Kristian Høgsberg 已提交
525 526
static const char sign_off_header[] = "Signed-off-by: ";

527
static void determine_author_info(struct strbuf *author_ident)
528 529 530 531 532 533 534
{
	char *name, *email, *date;

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

535
	if (author_message) {
536 537
		const char *a, *lb, *rb, *eol;

538
		a = strstr(author_message_buffer, "\nauthor ");
539
		if (!a)
J
Junio C Hamano 已提交
540
			die(_("invalid commit: %s"), author_message);
541

542 543 544 545
		lb = strchrnul(a + strlen("\nauthor "), '<');
		rb = strchrnul(lb, '>');
		eol = strchrnul(rb, '\n');
		if (!*lb || !*rb || !*eol)
J
Junio C Hamano 已提交
546
			die(_("invalid commit: %s"), author_message);
547

548 549 550 551 552 553 554 555 556
		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("> ")));
557 558 559 560 561 562 563
	}

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

		if (!lb || !rb)
564
			die(_("malformed --author parameter"));
565 566 567 568
		name = xstrndup(force_author, lb - force_author);
		email = xstrndup(lb + 2, rb - (lb + 2));
	}

M
Miklos Vajna 已提交
569 570
	if (force_date)
		date = force_date;
571 572
	strbuf_addstr(author_ident, fmt_ident(name, email, date,
					      IDENT_ERROR_ON_NO_NAME));
573 574
}

575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
static int ends_rfc2822_footer(struct strbuf *sb)
{
	int ch;
	int hit = 0;
	int i, j, k;
	int len = sb->len;
	int first = 1;
	const char *buf = sb->buf;

	for (i = len - 1; i > 0; i--) {
		if (hit && buf[i] == '\n')
			break;
		hit = (buf[i] == '\n');
	}

	while (i < len - 1 && buf[i] == '\n')
		i++;

	for (; i < len; i = k) {
		for (k = i; k < len && buf[k] != '\n'; k++)
			; /* do nothing */
		k++;

		if ((buf[k] == ' ' || buf[k] == '\t') && !first)
			continue;

		first = 0;

		for (j = 0; i + j < len; j++) {
			ch = buf[i + j];
			if (ch == ':')
				break;
			if (isalnum(ch) ||
			    (ch == '-'))
				continue;
			return 0;
		}
	}
	return 1;
}

616 617 618 619
static char *cut_ident_timestamp_part(char *string)
{
	char *ket = strrchr(string, '>');
	if (!ket || ket[1] != ' ')
620
		die(_("Malformed ident string: '%s'"), string);
621 622 623 624
	*++ket = '\0';
	return ket;
}

625
static int prepare_to_commit(const char *index_file, const char *prefix,
626
			     struct commit *current_head,
627 628
			     struct wt_status *s,
			     struct strbuf *author_ident)
K
Kristian Høgsberg 已提交
629 630
{
	struct stat statbuf;
631
	struct strbuf committer_ident = STRBUF_INIT;
632
	int commitable, saved_color_setting;
633
	struct strbuf sb = STRBUF_INIT;
K
Kristian Høgsberg 已提交
634
	char *buffer;
635 636
	const char *hook_arg1 = NULL;
	const char *hook_arg2 = NULL;
637
	int ident_shown = 0;
638
	int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
K
Kristian Høgsberg 已提交
639

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

643 644 645 646 647 648 649 650 651 652 653 654
	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)
655
				die(_("could not lookup commit %s"), squash_message);
656 657 658 659 660 661
			ctx.output_encoding = get_commit_output_encoding();
			format_commit_message(c, "squash! %s\n\n", &sb,
					      &ctx);
		}
	}

662 663
	if (message.len) {
		strbuf_addbuf(&sb, &message);
664
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
665 666
	} else if (logfile && !strcmp(logfile, "-")) {
		if (isatty(0))
667
			fprintf(stderr, _("(reading log message from standard input)\n"));
K
Kristian Høgsberg 已提交
668
		if (strbuf_read(&sb, 0, 0) < 0)
669
			die_errno(_("could not read log from standard input"));
670
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
671 672
	} else if (logfile) {
		if (strbuf_read_file(&sb, logfile, 0) < 0)
673
			die_errno(_("could not read log file '%s'"),
674
				  logfile);
675
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
676 677 678
	} else if (use_message) {
		buffer = strstr(use_message_buffer, "\n\n");
		if (!buffer || buffer[2] == '\0')
679
			die(_("commit has empty message"));
K
Kristian Høgsberg 已提交
680
		strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
681 682
		hook_arg1 = "commit";
		hook_arg2 = use_message;
683 684 685 686 687
	} else if (fixup_message) {
		struct pretty_print_context ctx = {0};
		struct commit *commit;
		commit = lookup_commit_reference_by_name(fixup_message);
		if (!commit)
688
			die(_("could not lookup commit %s"), fixup_message);
689 690 691 692
		ctx.output_encoding = get_commit_output_encoding();
		format_commit_message(commit, "fixup! %s\n\n",
				      &sb, &ctx);
		hook_arg1 = "message";
K
Kristian Høgsberg 已提交
693 694
	} else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
		if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
695
			die_errno(_("could not read MERGE_MSG"));
696
		hook_arg1 = "merge";
K
Kristian Høgsberg 已提交
697 698
	} else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
		if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
699
			die_errno(_("could not read SQUASH_MSG"));
700
		hook_arg1 = "squash";
701
	} else if (template_file) {
K
Kristian Høgsberg 已提交
702
		if (strbuf_read_file(&sb, template_file, 0) < 0)
703
			die_errno(_("could not read '%s'"), template_file);
704
		hook_arg1 = "template";
705
		clean_message_contents = 0;
K
Kristian Høgsberg 已提交
706 707
	}

708
	/*
709 710
	 * The remaining cases don't modify the template message, but
	 * just set the argument(s) to the prepare-commit-msg hook.
711
	 */
712
	else if (whence == FROM_MERGE)
713
		hook_arg1 = "merge";
714 715 716 717
	else if (whence == FROM_CHERRY_PICK) {
		hook_arg1 = "commit";
		hook_arg2 = "CHERRY_PICK_HEAD";
	}
718

719 720 721 722 723 724 725 726 727 728
	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 = "";
	}

729 730
	s->fp = fopen(git_path(commit_editmsg), "w");
	if (s->fp == NULL)
731
		die_errno(_("could not open '%s'"), git_path(commit_editmsg));
K
Kristian Høgsberg 已提交
732

733
	if (clean_message_contents)
734
		stripspace(&sb, 0);
K
Kristian Høgsberg 已提交
735 736

	if (signoff) {
737
		struct strbuf sob = STRBUF_INIT;
738 739 740
		int i;

		strbuf_addstr(&sob, sign_off_header);
741 742
		strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
					     getenv("GIT_COMMITTER_EMAIL")));
743 744 745
		strbuf_addch(&sob, '\n');
		for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
			; /* do nothing */
746
		if (prefixcmp(sb.buf + i, sob.buf)) {
747
			if (!i || !ends_rfc2822_footer(&sb))
748
				strbuf_addch(&sb, '\n');
749
			strbuf_addbuf(&sb, &sob);
750
		}
751
		strbuf_release(&sob);
K
Kristian Høgsberg 已提交
752 753
	}

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

K
Kristian Høgsberg 已提交
757 758
	strbuf_release(&sb);

759 760
	/* This checks and barfs if author is badly specified */
	determine_author_info(author_ident);
761

762
	/* This checks if committer ident is explicitly given */
763
	strbuf_addstr(&committer_ident, git_committer_info(0));
764
	if (use_editor && include_status) {
765
		char *ai_tmp, *ci_tmp;
766
		if (whence != FROM_COMMIT)
767
			status_printf_ln(s, GIT_COLOR_NORMAL,
768
				_("\n"
769
				"It looks like you may be committing a %s.\n"
770 771 772
				"If this is not correct, please remove the file\n"
				"	%s\n"
				"and try again.\n"
773
				""),
774 775 776 777
				whence_s(),
				git_path(whence == FROM_MERGE
					 ? "MERGE_HEAD"
					 : "CHERRY_PICK_HEAD"));
778

779 780
		fprintf(s->fp, "\n");
		status_printf(s, GIT_COLOR_NORMAL,
781
			_("Please enter the commit message for your changes."));
782
		if (cleanup_mode == CLEANUP_ALL)
783
			status_printf_more(s, GIT_COLOR_NORMAL,
784
				_(" Lines starting\n"
785
				"with '#' will be ignored, and an empty"
786
				" message aborts the commit.\n"));
787
		else /* CLEANUP_SPACE, that is. */
788
			status_printf_more(s, GIT_COLOR_NORMAL,
789
				_(" Lines starting\n"
790
				"with '#' will be kept; you may remove them"
J
Jeff King 已提交
791
				" yourself if you want to.\n"
792
				"An empty message aborts the commit.\n"));
793
		if (only_include_assumed)
794 795
			status_printf_ln(s, GIT_COLOR_NORMAL,
					"%s", only_include_assumed);
796

797 798 799
		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))
800
			status_printf_ln(s, GIT_COLOR_NORMAL,
801 802
				_("%s"
				"Author:    %s"),
803
				ident_shown++ ? "" : "\n",
804
				author_ident->buf);
805

806
		if (!user_ident_sufficiently_given())
807
			status_printf_ln(s, GIT_COLOR_NORMAL,
808 809
				_("%s"
				"Committer: %s"),
810
				ident_shown++ ? "" : "\n",
811
				committer_ident.buf);
812 813

		if (ident_shown)
814
			status_printf_ln(s, GIT_COLOR_NORMAL, "");
815

816 817
		saved_color_setting = s->use_color;
		s->use_color = 0;
818
		commitable = run_status(s->fp, index_file, prefix, 1, s);
819
		s->use_color = saved_color_setting;
820 821 822

		*ai_tmp = ' ';
		*ci_tmp = ' ';
823
	} else {
824
		unsigned char sha1[20];
825
		const char *parent = "HEAD";
826 827

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

830 831 832
		if (amend)
			parent = "HEAD^1";

833
		if (get_sha1(parent, sha1))
834
			commitable = !!active_nr;
835 836
		else
			commitable = index_differs_from(parent, 0);
837
	}
838
	strbuf_release(&committer_ident);
839

840
	fclose(s->fp);
841

842 843 844 845 846 847
	/*
	 * 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 &&
848
	    !(amend && is_a_merge(current_head))) {
849
		run_status(stdout, index_file, prefix, 0, s);
J
Jeff King 已提交
850
		if (amend)
851
			fputs(_(empty_amend_advice), stderr);
852
		else if (whence == FROM_CHERRY_PICK)
J
Junio C Hamano 已提交
853
			fputs(_(empty_cherry_pick_advice), stderr);
854
		return 0;
855 856
	}

857 858 859 860 861 862 863 864 865 866 867
	/*
	 * 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);
	if (!active_cache_tree)
		active_cache_tree = cache_tree();
	if (cache_tree_update(active_cache_tree,
			      active_cache, active_nr, 0, 0) < 0) {
868
		error(_("Error building trees"));
869
		return 0;
870
	}
K
Kristian Høgsberg 已提交
871

872 873 874
	if (run_hook(index_file, "prepare-commit-msg",
		     git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
		return 0;
K
Kristian Høgsberg 已提交
875

876 877
	if (use_editor) {
		char index[PATH_MAX];
878 879
		const char *env[2] = { NULL };
		env[0] =  index;
880
		snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
S
Stephan Beyer 已提交
881 882
		if (launch_editor(git_path(commit_editmsg), NULL, env)) {
			fprintf(stderr,
883
			_("Please supply the message using either -m or -F option.\n"));
S
Stephan Beyer 已提交
884 885
			exit(1);
		}
886
	}
K
Kristian Høgsberg 已提交
887

888 889 890 891
	if (!no_verify &&
	    run_hook(index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
		return 0;
	}
K
Kristian Høgsberg 已提交
892

893
	return 1;
K
Kristian Høgsberg 已提交
894 895 896
}

/*
M
Miklos Vajna 已提交
897 898
 * Find out if the message in the strbuf contains only whitespace and
 * Signed-off-by lines.
K
Kristian Høgsberg 已提交
899
 */
M
Miklos Vajna 已提交
900
static int message_is_empty(struct strbuf *sb)
K
Kristian Høgsberg 已提交
901
{
902
	struct strbuf tmpl = STRBUF_INIT;
K
Kristian Høgsberg 已提交
903
	const char *nl;
M
Miklos Vajna 已提交
904
	int eol, i, start = 0;
K
Kristian Høgsberg 已提交
905

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

K
Kristian Høgsberg 已提交
909 910
	/* See if the template is just a prefix of the message. */
	if (template_file && strbuf_read_file(&tmpl, template_file, 0) > 0) {
911
		stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
K
Kristian Høgsberg 已提交
912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938
		if (start + tmpl.len <= sb->len &&
		    memcmp(tmpl.buf, sb->buf + start, tmpl.len) == 0)
			start += tmpl.len;
	}
	strbuf_release(&tmpl);

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

939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956
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) {
957 958
		struct pretty_print_context ctx = {0};
		ctx.date_mode = DATE_NORMAL;
959
		strbuf_release(&buf);
960
		format_commit_message(commit, "%an <%ae>", &buf, &ctx);
961 962
		return strbuf_detach(&buf, NULL);
	}
963
	die(_("No existing author found with '%s'"), name);
964 965
}

966 967 968 969 970 971 972 973 974 975 976 977

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

981 982 983 984 985 986 987
static const char *read_commit_message(const char *name)
{
	const char *out_enc, *out;
	struct commit *commit;

	commit = lookup_commit_reference_by_name(name);
	if (!commit)
J
Junio C Hamano 已提交
988
		die(_("could not lookup commit %s"), name);
989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002
	out_enc = get_commit_output_encoding();
	out = logmsg_reencode(commit, out_enc);

	/*
	 * If we failed to reencode the buffer, just copy it
	 * byte for byte so the user can try to fix it up.
	 * This also handles the case where input and output
	 * encodings are identical.
	 */
	if (out == NULL)
		out = xstrdup(commit->buffer);
	return out;
}

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

1011 1012
	argc = parse_options(argc, argv, prefix, builtin_commit_options, usage,
			     0);
K
Kristian Høgsberg 已提交
1013

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

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

1020
	if (logfile || message.len || use_message || fixup_message)
1021
		use_editor = 0;
K
Kristian Høgsberg 已提交
1022
	if (edit_flag)
1023
		use_editor = 1;
1024 1025
	if (!use_editor)
		setenv("GIT_EDITOR", ":", 1);
K
Kristian Høgsberg 已提交
1026 1027

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

1064 1065 1066
	if (patch_interactive)
		interactive = 1;

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

1086
	handle_untracked_files_arg(s);
1087

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

1091 1092 1093 1094 1095
	if (null_termination && status_format == STATUS_FORMAT_LONG)
		status_format = STATUS_FORMAT_PORCELAIN;
	if (status_format != STATUS_FORMAT_LONG)
		dry_run = 1;

K
Kristian Høgsberg 已提交
1096 1097 1098
	return argc;
}

1099
static int dry_run_commit(int argc, const char **argv, const char *prefix,
1100
			  const struct commit *current_head, struct wt_status *s)
K
Kristian Høgsberg 已提交
1101 1102
{
	int commitable;
J
Junio C Hamano 已提交
1103
	const char *index_file;
K
Kristian Høgsberg 已提交
1104

1105
	index_file = prepare_index(argc, argv, prefix, current_head, 1);
1106
	commitable = run_status(stdout, index_file, prefix, 0, s);
J
Junio C Hamano 已提交
1107
	rollback_index_files();
K
Kristian Høgsberg 已提交
1108

J
Junio C Hamano 已提交
1109 1110 1111
	return commitable ? 0 : 1;
}

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

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

	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;
	}
	if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1144
		s->use_color = git_config_colorbool(k, v);
1145 1146 1147 1148
		return 0;
	}
	if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
		int slot = parse_status_slot(k, 13);
J
Jeff King 已提交
1149 1150
		if (slot < 0)
			return 0;
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
		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
1170
			return error(_("Invalid untracked files mode '%s'"), v);
1171 1172 1173 1174 1175
		return 0;
	}
	return git_diff_ui_config(k, v, NULL);
}

J
Junio C Hamano 已提交
1176 1177
int cmd_status(int argc, const char **argv, const char *prefix)
{
1178
	struct wt_status s;
1179
	int fd;
1180
	unsigned char sha1[20];
1181
	static struct option builtin_status_options[] = {
1182
		OPT__VERBOSE(&verbose, "be verbose"),
1183 1184
		OPT_SET_INT('s', "short", &status_format,
			    "show status concisely", STATUS_FORMAT_SHORT),
1185 1186
		OPT_BOOLEAN('b', "branch", &status_show_branch,
			    "show branch information"),
1187
		OPT_SET_INT(0, "porcelain", &status_format,
1188
			    "machine-readable output",
1189
			    STATUS_FORMAT_PORCELAIN),
1190 1191
		OPT_BOOLEAN('z', "null", &null_termination,
			    "terminate entries with NUL"),
1192 1193 1194 1195
		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
		  "mode",
		  "show untracked files, optional modes: all, normal, no. (Default: all)",
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1196 1197
		OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
			    "show ignored files"),
1198 1199 1200
		{ OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when",
		  "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)",
		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1201 1202 1203
		OPT_END(),
	};

1204 1205 1206
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_status_usage, builtin_status_options);

1207
	wt_status_prepare(&s);
1208
	gitmodules_config();
1209
	git_config(git_status_config, &s);
1210
	determine_whence(&s);
1211
	argc = parse_options(argc, argv, prefix,
1212 1213
			     builtin_status_options,
			     builtin_status_usage, 0);
1214 1215 1216 1217

	if (null_termination && status_format == STATUS_FORMAT_LONG)
		status_format = STATUS_FORMAT_PORCELAIN;

1218
	handle_untracked_files_arg(&s);
1219 1220
	if (show_ignored_in_status)
		s.show_ignored_files = 1;
1221 1222 1223
	if (*argv)
		s.pathspec = get_pathspec(prefix, argv);

1224
	read_cache_preload(s.pathspec);
1225
	refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);
1226 1227

	fd = hold_locked_index(&index_lock, 0);
1228 1229
	if (0 <= fd)
		update_index_if_able(&the_index, &index_lock);
1230

1231
	s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1232
	s.ignore_submodule_arg = ignore_submodule_arg;
1233 1234
	wt_status_collect(&s);

J
Jeff King 已提交
1235 1236
	if (s.relative_paths)
		s.prefix = prefix;
1237

1238 1239
	switch (status_format) {
	case STATUS_FORMAT_SHORT:
1240
		wt_shortstatus_print(&s, null_termination, status_show_branch);
1241
		break;
1242
	case STATUS_FORMAT_PORCELAIN:
1243
		wt_porcelain_print(&s, null_termination);
1244
		break;
1245
	case STATUS_FORMAT_LONG:
1246
		s.verbose = verbose;
1247
		s.ignore_submodule_arg = ignore_submodule_arg;
1248
		wt_status_print(&s);
1249
		break;
1250
	}
1251
	return 0;
K
Kristian Høgsberg 已提交
1252 1253
}

1254 1255
static void print_summary(const char *prefix, const unsigned char *sha1,
			  int initial_commit)
K
Kristian Høgsberg 已提交
1256 1257 1258
{
	struct rev_info rev;
	struct commit *commit;
1259
	struct strbuf format = STRBUF_INIT;
J
Jeff King 已提交
1260 1261
	unsigned char junk_sha1[20];
	const char *head = resolve_ref("HEAD", junk_sha1, 0, NULL);
1262 1263 1264
	struct pretty_print_context pctx = {0};
	struct strbuf author_ident = STRBUF_INIT;
	struct strbuf committer_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1265 1266 1267

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

1272 1273 1274 1275 1276 1277 1278 1279
	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);
	}
1280
	if (!user_ident_sufficiently_given()) {
1281 1282
		strbuf_addstr(&format, "\n Committer: ");
		strbuf_addbuf_percentquote(&format, &committer_ident);
1283 1284
		if (advice_implicit_identity) {
			strbuf_addch(&format, '\n');
1285
			strbuf_addstr(&format, _(implicit_ident_advice));
1286
		}
1287 1288 1289 1290
	}
	strbuf_release(&author_ident);
	strbuf_release(&committer_ident);

K
Kristian Høgsberg 已提交
1291 1292 1293 1294 1295 1296 1297 1298 1299
	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;
1300
	get_commit_format(format.buf, &rev);
1301
	rev.always_show_header = 0;
1302 1303
	rev.diffopt.detect_rename = 1;
	rev.diffopt.break_opt = 0;
1304
	diff_setup_done(&rev.diffopt);
K
Kristian Høgsberg 已提交
1305

1306
	printf("[%s%s ",
J
Jeff King 已提交
1307 1308 1309
		!prefixcmp(head, "refs/heads/") ?
			head + 11 :
			!strcmp(head, "HEAD") ?
1310
				_("detached HEAD") :
J
Jeff King 已提交
1311
				head,
1312
		initial_commit ? _(" (root-commit)") : "");
K
Kristian Høgsberg 已提交
1313

1314
	if (!log_tree_commit(&rev, commit)) {
1315 1316 1317
		rev.always_show_header = 1;
		rev.use_terminator = 1;
		log_tree_commit(&rev, commit);
1318
	}
1319

1320
	strbuf_release(&format);
K
Kristian Høgsberg 已提交
1321 1322
}

1323
static int git_commit_config(const char *k, const char *v, void *cb)
K
Kristian Høgsberg 已提交
1324
{
1325 1326
	struct wt_status *s = cb;

1327
	if (!strcmp(k, "commit.template"))
1328
		return git_config_pathname(&template_file, k, v);
1329 1330 1331 1332
	if (!strcmp(k, "commit.status")) {
		include_status = git_config_bool(k, v);
		return 0;
	}
K
Kristian Høgsberg 已提交
1333

1334
	return git_status_config(k, v, s);
K
Kristian Høgsberg 已提交
1335 1336
}

1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370
static const char post_rewrite_hook[] = "hooks/post-rewrite";

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;

	if (access(git_path(post_rewrite_hook), X_OK) < 0)
		return 0;

	argv[0] = git_path(post_rewrite_hook);
	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 已提交
1371 1372
int cmd_commit(int argc, const char **argv, const char *prefix)
{
1373
	struct strbuf sb = STRBUF_INIT;
1374
	struct strbuf author_ident = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1375
	const char *index_file, *reflog_msg;
1376
	char *nl, *p;
1377
	unsigned char sha1[20];
K
Kristian Høgsberg 已提交
1378
	struct ref_lock *ref_lock;
M
Miklos Vajna 已提交
1379
	struct commit_list *parents = NULL, **pptr = &parents;
1380 1381
	struct stat statbuf;
	int allow_fast_forward = 1;
1382
	struct wt_status s;
1383
	struct commit *current_head = NULL;
K
Kristian Høgsberg 已提交
1384

1385 1386 1387
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage_with_options(builtin_commit_usage, builtin_commit_options);

1388 1389
	wt_status_prepare(&s);
	git_config(git_commit_config, &s);
1390
	determine_whence(&s);
K
Kristian Høgsberg 已提交
1391

1392 1393 1394 1395 1396 1397 1398
	if (get_sha1("HEAD", sha1))
		current_head = NULL;
	else {
		current_head = lookup_commit(sha1);
		if (!current_head || parse_commit(current_head))
			die(_("could not parse HEAD commit"));
	}
1399
	argc = parse_and_validate_options(argc, argv, builtin_commit_usage,
1400
					  prefix, current_head, &s);
1401
	if (dry_run)
1402 1403
		return dry_run_commit(argc, argv, prefix, current_head, &s);
	index_file = prepare_index(argc, argv, prefix, current_head, 0);
K
Kristian Høgsberg 已提交
1404

1405 1406
	/* Set up everything for writing the commit object.  This includes
	   running hooks, writing the trees, and interacting with the user.  */
1407 1408
	if (!prepare_to_commit(index_file, prefix,
			       current_head, &s, &author_ident)) {
1409
		rollback_index_files();
K
Kristian Høgsberg 已提交
1410 1411 1412 1413
		return 1;
	}

	/* Determine parents */
1414
	reflog_msg = getenv("GIT_REFLOG_ACTION");
1415
	if (!current_head) {
1416 1417
		if (!reflog_msg)
			reflog_msg = "commit (initial)";
K
Kristian Høgsberg 已提交
1418 1419 1420
	} else if (amend) {
		struct commit_list *c;

1421 1422
		if (!reflog_msg)
			reflog_msg = "commit (amend)";
1423
		for (c = current_head->parents; c; c = c->next)
M
Miklos Vajna 已提交
1424
			pptr = &commit_list_insert(c->item, pptr)->next;
1425
	} else if (whence == FROM_MERGE) {
1426
		struct strbuf m = STRBUF_INIT;
K
Kristian Høgsberg 已提交
1427 1428
		FILE *fp;

1429 1430
		if (!reflog_msg)
			reflog_msg = "commit (merge)";
1431
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1432 1433
		fp = fopen(git_path("MERGE_HEAD"), "r");
		if (fp == NULL)
1434
			die_errno(_("could not open '%s' for reading"),
1435
				  git_path("MERGE_HEAD"));
1436 1437 1438
		while (strbuf_getline(&m, fp, '\n') != EOF) {
			unsigned char sha1[20];
			if (get_sha1_hex(m.buf, sha1) < 0)
1439
				die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
M
Miklos Vajna 已提交
1440
			pptr = &commit_list_insert(lookup_commit(sha1), pptr)->next;
1441
		}
K
Kristian Høgsberg 已提交
1442 1443
		fclose(fp);
		strbuf_release(&m);
1444 1445
		if (!stat(git_path("MERGE_MODE"), &statbuf)) {
			if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1446
				die_errno(_("could not read MERGE_MODE"));
1447 1448 1449 1450 1451
			if (!strcmp(sb.buf, "no-ff"))
				allow_fast_forward = 0;
		}
		if (allow_fast_forward)
			parents = reduce_heads(parents);
K
Kristian Høgsberg 已提交
1452
	} else {
1453
		if (!reflog_msg)
1454 1455 1456
			reflog_msg = (whence == FROM_CHERRY_PICK)
					? "commit (cherry-pick)"
					: "commit";
1457
		pptr = &commit_list_insert(current_head, pptr)->next;
K
Kristian Høgsberg 已提交
1458 1459
	}

1460
	/* Finally, get the commit message */
1461
	strbuf_reset(&sb);
1462
	if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1463
		int saved_errno = errno;
1464
		rollback_index_files();
1465
		die(_("could not read commit message: %s"), strerror(saved_errno));
1466
	}
1467 1468

	/* Truncate the message just before the diff, if any. */
1469 1470 1471 1472 1473
	if (verbose) {
		p = strstr(sb.buf, "\ndiff --git ");
		if (p != NULL)
			strbuf_setlen(&sb, p - sb.buf + 1);
	}
1474

1475 1476
	if (cleanup_mode != CLEANUP_NONE)
		stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1477
	if (message_is_empty(&sb) && !allow_empty_message) {
1478
		rollback_index_files();
1479
		fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
J
Jeff King 已提交
1480
		exit(1);
1481
	}
K
Kristian Høgsberg 已提交
1482

1483
	if (commit_tree(sb.buf, active_cache_tree->sha1, parents, sha1,
1484
			author_ident.buf)) {
1485
		rollback_index_files();
1486
		die(_("failed to write commit object"));
1487
	}
1488
	strbuf_release(&author_ident);
K
Kristian Høgsberg 已提交
1489 1490

	ref_lock = lock_any_ref_for_update("HEAD",
1491 1492 1493
					   !current_head
					   ? NULL
					   : current_head->object.sha1,
K
Kristian Høgsberg 已提交
1494 1495
					   0);

M
Miklos Vajna 已提交
1496
	nl = strchr(sb.buf, '\n');
1497 1498 1499 1500 1501 1502
	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 已提交
1503

1504 1505
	if (!ref_lock) {
		rollback_index_files();
1506
		die(_("cannot lock HEAD ref"));
1507
	}
1508
	if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1509
		rollback_index_files();
1510
		die(_("cannot update HEAD ref"));
1511
	}
K
Kristian Høgsberg 已提交
1512

J
Jay Soffian 已提交
1513
	unlink(git_path("CHERRY_PICK_HEAD"));
K
Kristian Høgsberg 已提交
1514 1515
	unlink(git_path("MERGE_HEAD"));
	unlink(git_path("MERGE_MSG"));
1516
	unlink(git_path("MERGE_MODE"));
1517
	unlink(git_path("SQUASH_MSG"));
K
Kristian Høgsberg 已提交
1518

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

1524
	rerere(0);
1525
	run_hook(get_index_file(), "post-commit", NULL);
1526
	if (amend && !no_post_rewrite) {
1527 1528 1529
		struct notes_rewrite_cfg *cfg;
		cfg = init_copy_notes_for_rewrite("amend");
		if (cfg) {
1530 1531
			/* we are amending, so current_head is not NULL */
			copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1532 1533
			finish_copy_notes_for_rewrite(cfg);
		}
1534
		run_rewrite_hook(current_head->object.sha1, sha1);
1535
	}
K
Kristian Høgsberg 已提交
1536
	if (!quiet)
1537
		print_summary(prefix, sha1, !current_head);
K
Kristian Høgsberg 已提交
1538 1539 1540

	return 0;
}