]> git.ipfire.org Git - thirdparty/git.git/blame - builtin/commit.c
Git 2.14.2
[thirdparty/git.git] / builtin / commit.c
CommitLineData
f5bbc322
KH
1/*
2 * Builtin "git commit"
3 *
4 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
5 * Based on git-commit.sh by Junio C Hamano and Linus Torvalds
6 */
7
8#include "cache.h"
b2141fc1 9#include "config.h"
697cc8ef 10#include "lockfile.h"
f5bbc322 11#include "cache-tree.h"
6b2f2d98 12#include "color.h"
2888605c 13#include "dir.h"
f5bbc322
KH
14#include "builtin.h"
15#include "diff.h"
16#include "diffcore.h"
17#include "commit.h"
18#include "revision.h"
19#include "wt-status.h"
20#include "run-command.h"
21#include "refs.h"
22#include "log-tree.h"
23#include "strbuf.h"
24#include "utf8.h"
25#include "parse-options.h"
c455c87c 26#include "string-list.h"
5b2fd956 27#include "rerere.h"
fa9dcf80 28#include "unpack-trees.h"
76e2f7ce 29#include "quote.h"
302ad7a9 30#include "submodule.h"
ba3c69a9 31#include "gpg-interface.h"
323d0530 32#include "column.h"
5ed75e2a 33#include "sequencer.h"
49c24704 34#include "notes-utils.h"
ea16794e 35#include "mailmap.h"
af65f68c 36#include "sigchain.h"
f5bbc322
KH
37
38static const char * const builtin_commit_usage[] = {
9c9b4f2f 39 N_("git commit [<options>] [--] <pathspec>..."),
f5bbc322
KH
40 NULL
41};
42
2f02b25f 43static const char * const builtin_status_usage[] = {
9c9b4f2f 44 N_("git status [<options>] [--] <pathspec>..."),
2f02b25f
SB
45 NULL
46};
47
8b27ff7e
MM
48static const char implicit_ident_advice_noconfig[] =
49N_("Your name and email address were configured automatically based\n"
50"on your username and hostname. Please check that they are accurate.\n"
51"You can suppress this message by setting them explicitly. Run the\n"
52"following command and follow the instructions in your editor to edit\n"
53"your configuration file:\n"
54"\n"
55" git config --global --edit\n"
56"\n"
57"After doing this, you may fix the identity used for this commit with:\n"
58"\n"
59" git commit --amend --reset-author\n");
60
61static const char implicit_ident_advice_config[] =
fc88e316 62N_("Your name and email address were configured automatically based\n"
49ff9a7a
JK
63"on your username and hostname. Please check that they are accurate.\n"
64"You can suppress this message by setting them explicitly:\n"
65"\n"
8bb45b25 66" git config --global user.name \"Your Name\"\n"
49ff9a7a
JK
67" git config --global user.email you@example.com\n"
68"\n"
3f142468 69"After doing this, you may fix the identity used for this commit with:\n"
49ff9a7a 70"\n"
fc88e316 71" git commit --amend --reset-author\n");
49ff9a7a 72
f197ed2f 73static const char empty_amend_advice[] =
fc88e316 74N_("You asked to amend the most recent commit, but doing so would make\n"
f197ed2f 75"it empty. You can repeat your command with --allow-empty, or you can\n"
fc88e316 76"remove the commit entirely with \"git reset HEAD^\".\n");
f197ed2f 77
37f7a857 78static const char empty_cherry_pick_advice[] =
6c80cd29 79N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
37f7a857
JS
80"If you wish to commit it anyway, use:\n"
81"\n"
82" git commit --allow-empty\n"
c17592a7
JK
83"\n");
84
85static const char empty_cherry_pick_advice_single[] =
86N_("Otherwise, please use 'git reset'\n");
87
88static const char empty_cherry_pick_advice_multi[] =
89N_("If you wish to skip this commit, use:\n"
37f7a857 90"\n"
c17592a7
JK
91" git reset\n"
92"\n"
93"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
94"the remaining commits.\n");
37f7a857 95
e51b0dfc
PB
96static GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
97
37f7a857 98static const char *use_message_buffer;
2888605c
JH
99static struct lock_file index_lock; /* real index */
100static struct lock_file false_lock; /* used only for partial commits */
101static enum {
102 COMMIT_AS_IS = 1,
103 COMMIT_NORMAL,
4b05548f 104 COMMIT_PARTIAL
2888605c 105} commit_style;
f5bbc322 106
dbd0f5c7 107static const char *logfile, *force_author;
984c6e7e 108static const char *template_file;
37f7a857
JS
109/*
110 * The _message variables are commit names from which to take
111 * the commit message and/or authorship.
112 */
113static const char *author_message, *author_message_buffer;
f5bbc322 114static char *edit_message, *use_message;
89ac1223 115static char *fixup_message, *squash_message;
ca1ba201
JH
116static int all, also, interactive, patch_interactive, only, amend, signoff;
117static int edit_flag = -1; /* unspecified */
c51f6cee 118static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
aaab8420 119static int config_commit_verbose = -1; /* unspecified */
c9b5fde7 120static int no_post_rewrite, allow_empty_message;
46a958b3 121static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
ba3c69a9
JH
122static char *sign_commit;
123
5f065737
AR
124/*
125 * The default commit message cleanup mode will remove the lines
126 * beginning with # (shell comments) and leading and trailing
127 * whitespaces (empty lines or containing only whitespaces)
128 * if editor is used, and only the whitespaces if the message
129 * is specified explicitly.
130 */
131static enum {
132 CLEANUP_SPACE,
133 CLEANUP_NONE,
75df1f43 134 CLEANUP_SCISSORS,
4b05548f 135 CLEANUP_ALL
5f065737 136} cleanup_mode;
51fb3a3d 137static const char *cleanup_arg;
f5bbc322 138
37f7a857 139static enum commit_whence whence;
c17592a7 140static int sequencer_in_use;
06bb643b 141static int use_editor = 1, include_status = 1;
25206778 142static int show_ignored_in_status, have_option_m;
2c47789d 143static struct strbuf message = STRBUF_INIT;
f9568530 144
be7e795e 145static enum wt_status_format status_format = STATUS_FORMAT_UNSPECIFIED;
84b4202d 146
c4f596b9
JH
147static int opt_parse_porcelain(const struct option *opt, const char *arg, int unset)
148{
149 enum wt_status_format *value = (enum wt_status_format *)opt->value;
150 if (unset)
151 *value = STATUS_FORMAT_NONE;
152 else if (!arg)
153 *value = STATUS_FORMAT_PORCELAIN;
154 else if (!strcmp(arg, "v1") || !strcmp(arg, "1"))
155 *value = STATUS_FORMAT_PORCELAIN;
1ecdecce
JH
156 else if (!strcmp(arg, "v2") || !strcmp(arg, "2"))
157 *value = STATUS_FORMAT_PORCELAIN_V2;
c4f596b9
JH
158 else
159 die("unsupported porcelain version '%s'", arg);
160
161 return 0;
162}
7c9f7038 163
f9568530
JS
164static int opt_parse_m(const struct option *opt, const char *arg, int unset)
165{
166 struct strbuf *buf = opt->value;
25206778
RS
167 if (unset) {
168 have_option_m = 0;
f9568530 169 strbuf_setlen(buf, 0);
25206778
RS
170 } else {
171 have_option_m = 1;
a24a41ea
BC
172 if (buf->len)
173 strbuf_addch(buf, '\n');
f9568530 174 strbuf_addstr(buf, arg);
a24a41ea 175 strbuf_complete_line(buf);
f9568530
JS
176 }
177 return 0;
178}
f5bbc322 179
37f7a857
JS
180static void determine_whence(struct wt_status *s)
181{
f932729c 182 if (file_exists(git_path_merge_head()))
37f7a857 183 whence = FROM_MERGE;
f932729c 184 else if (file_exists(git_path_cherry_pick_head())) {
37f7a857 185 whence = FROM_CHERRY_PICK;
8a2a0f53 186 if (file_exists(git_path_seq_dir()))
c17592a7
JK
187 sequencer_in_use = 1;
188 }
37f7a857
JS
189 else
190 whence = FROM_COMMIT;
191 if (s)
192 s->whence = whence;
193}
194
5c25dfaa
MM
195static void status_init_config(struct wt_status *s, config_fn_t fn)
196{
197 wt_status_prepare(s);
198 gitmodules_config();
199 git_config(fn, s);
200 determine_whence(s);
5404c116 201 init_diff_ui_defaults();
6a964f57 202 s->hints = advice_status_hints; /* must come after git_config() */
5c25dfaa
MM
203}
204
2888605c
JH
205static void rollback_index_files(void)
206{
207 switch (commit_style) {
208 case COMMIT_AS_IS:
209 break; /* nothing to do */
210 case COMMIT_NORMAL:
211 rollback_lock_file(&index_lock);
212 break;
213 case COMMIT_PARTIAL:
214 rollback_lock_file(&index_lock);
215 rollback_lock_file(&false_lock);
216 break;
217 }
218}
219
5a9dd399 220static int commit_index_files(void)
2888605c 221{
5a9dd399
BC
222 int err = 0;
223
2888605c
JH
224 switch (commit_style) {
225 case COMMIT_AS_IS:
226 break; /* nothing to do */
227 case COMMIT_NORMAL:
5a9dd399 228 err = commit_lock_file(&index_lock);
2888605c
JH
229 break;
230 case COMMIT_PARTIAL:
5a9dd399 231 err = commit_lock_file(&index_lock);
2888605c
JH
232 rollback_lock_file(&false_lock);
233 break;
234 }
5a9dd399
BC
235
236 return err;
2888605c
JH
237}
238
239/*
240 * Take a union of paths in the index and the named tree (typically, "HEAD"),
241 * and return the paths that match the given pattern in list.
242 */
c455c87c 243static int list_paths(struct string_list *list, const char *with_tree,
17ddc66e 244 const char *prefix, const struct pathspec *pattern)
2888605c 245{
5d0b9bf8 246 int i, ret;
2888605c
JH
247 char *m;
248
17ddc66e 249 if (!pattern->nr)
ea2d4ed3
JK
250 return 0;
251
17ddc66e 252 m = xcalloc(1, pattern->nr);
2888605c 253
8894d535 254 if (with_tree) {
f950eb95 255 char *max_prefix = common_prefix(pattern);
312c984a
BW
256 overlay_tree_on_index(&the_index, with_tree,
257 max_prefix ? max_prefix : prefix);
5879f568 258 free(max_prefix);
8894d535 259 }
2888605c
JH
260
261 for (i = 0; i < active_nr; i++) {
9c5e6c80 262 const struct cache_entry *ce = active_cache[i];
7fce6e3c
NTND
263 struct string_list_item *item;
264
7a51ed66 265 if (ce->ce_flags & CE_UPDATE)
e87e22d0 266 continue;
429bb40a 267 if (!ce_path_match(ce, pattern, m))
2888605c 268 continue;
78a395d3 269 item = string_list_insert(list, ce->name);
7fce6e3c
NTND
270 if (ce_skip_worktree(ce))
271 item->util = item; /* better a valid pointer than a fake one */
2888605c
JH
272 }
273
5d0b9bf8
SB
274 ret = report_path_error(m, pattern, prefix);
275 free(m);
276 return ret;
2888605c
JH
277}
278
c455c87c 279static void add_remove_files(struct string_list *list)
2888605c
JH
280{
281 int i;
282 for (i = 0; i < list->nr; i++) {
d177cab0 283 struct stat st;
c455c87c 284 struct string_list_item *p = &(list->items[i]);
d177cab0 285
7fce6e3c
NTND
286 /* p->util is skip-worktree */
287 if (p->util)
b4d1690d 288 continue;
d177cab0 289
c455c87c
JS
290 if (!lstat(p->string, &st)) {
291 if (add_to_cache(p->string, &st, 0))
8a6179bc 292 die(_("updating files failed"));
960b8ad1 293 } else
c455c87c 294 remove_file_from_cache(p->string);
2888605c
JH
295 }
296}
297
06bb643b 298static void create_base_index(const struct commit *current_head)
fa9dcf80
LT
299{
300 struct tree *tree;
301 struct unpack_trees_options opts;
302 struct tree_desc t;
303
06bb643b 304 if (!current_head) {
fa9dcf80
LT
305 discard_cache();
306 return;
307 }
308
309 memset(&opts, 0, sizeof(opts));
310 opts.head_idx = 1;
311 opts.index_only = 1;
312 opts.merge = 1;
34110cd4
LT
313 opts.src_index = &the_index;
314 opts.dst_index = &the_index;
fa9dcf80
LT
315
316 opts.fn = oneway_merge;
a9dbc179 317 tree = parse_tree_indirect(&current_head->object.oid);
fa9dcf80 318 if (!tree)
8a6179bc 319 die(_("failed to unpack HEAD tree object"));
fa9dcf80
LT
320 parse_tree(tree);
321 init_tree_desc(&t, tree->buffer, tree->size);
203a2fe1
DB
322 if (unpack_trees(1, &t, &opts))
323 exit(128); /* We've already reported the error, finish dying */
fa9dcf80
LT
324}
325
d38a30df
MM
326static void refresh_cache_or_die(int refresh_flags)
327{
328 /*
329 * refresh_flags contains REFRESH_QUIET, so the only errors
330 * are for unmerged entries.
331 */
332 if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
333 die_resolve_conflict("commit");
334}
335
35ff08be
MH
336static const char *prepare_index(int argc, const char **argv, const char *prefix,
337 const struct commit *current_head, int is_status)
f5bbc322 338{
c455c87c 339 struct string_list partial;
6654c889 340 struct pathspec pathspec;
50b7e70f 341 int refresh_flags = REFRESH_QUIET;
b4fb09e4 342 const char *ret;
f5bbc322 343
50b7e70f
JH
344 if (is_status)
345 refresh_flags |= REFRESH_UNMERGED;
6654c889
NTND
346 parse_pathspec(&pathspec, 0,
347 PATHSPEC_PREFER_FULL,
348 prefix, argv);
f5bbc322 349
5ab2a2da 350 if (read_cache_preload(&pathspec) < 0)
8a6179bc 351 die(_("index file corrupt"));
671c9b7e 352
1020d087 353 if (interactive) {
e23fd15a 354 char *old_index_env = NULL;
b3e83cc7 355 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
1020d087
CI
356
357 refresh_cache_or_die(refresh_flags);
358
03b86647 359 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
1020d087
CI
360 die(_("unable to create temporary index"));
361
362 old_index_env = getenv(INDEX_ENVIRONMENT);
b4fb09e4 363 setenv(INDEX_ENVIRONMENT, get_lock_file_path(&index_lock), 1);
1020d087 364
b4bd4668 365 if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
1020d087
CI
366 die(_("interactive add failed"));
367
368 if (old_index_env && *old_index_env)
369 setenv(INDEX_ENVIRONMENT, old_index_env, 1);
370 else
371 unsetenv(INDEX_ENVIRONMENT);
372
373 discard_cache();
b4fb09e4 374 read_cache_from(get_lock_file_path(&index_lock));
9c4d6c02 375 if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) {
3fd13cbc 376 if (reopen_lock_file(&index_lock) < 0)
9c4d6c02 377 die(_("unable to write index file"));
3fd13cbc
JH
378 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
379 die(_("unable to update temporary index"));
9c4d6c02
DT
380 } else
381 warning(_("Failed to update main cache tree"));
1020d087
CI
382
383 commit_style = COMMIT_NORMAL;
b4fb09e4 384 return get_lock_file_path(&index_lock);
1020d087
CI
385 }
386
2888605c
JH
387 /*
388 * Non partial, non as-is commit.
389 *
390 * (1) get the real index;
391 * (2) update the_index as necessary;
392 * (3) write the_index out to the real index (still locked);
393 * (4) return the name of the locked index file.
394 *
395 * The caller should run hooks on the locked real index, and
396 * (A) if all goes well, commit the real index;
397 * (B) on failure, rollback the real index.
398 */
6654c889 399 if (all || (also && pathspec.nr)) {
b3e83cc7 400 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
610d55af 401 add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
d38a30df 402 refresh_cache_or_die(refresh_flags);
e859c69b 403 update_main_cache_tree(WRITE_TREE_SILENT);
03b86647 404 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
8a6179bc 405 die(_("unable to write new_index file"));
2888605c 406 commit_style = COMMIT_NORMAL;
b4fb09e4 407 return get_lock_file_path(&index_lock);
f5bbc322
KH
408 }
409
2888605c
JH
410 /*
411 * As-is commit.
412 *
413 * (1) return the name of the real index file.
414 *
73276235
MH
415 * The caller should run hooks on the real index,
416 * and create commit from the_index.
2888605c
JH
417 * We still need to refresh the index here.
418 */
6654c889 419 if (!only && !pathspec.nr) {
b3e83cc7 420 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
d38a30df 421 refresh_cache_or_die(refresh_flags);
9c4d6c02 422 if (active_cache_changed
475a3445 423 || !cache_tree_fully_valid(active_cache_tree))
e859c69b 424 update_main_cache_tree(WRITE_TREE_SILENT);
9c4d6c02 425 if (active_cache_changed) {
03b86647
NTND
426 if (write_locked_index(&the_index, &index_lock,
427 COMMIT_LOCK))
8a6179bc 428 die(_("unable to write new_index file"));
d5f5d0a9
JH
429 } else {
430 rollback_lock_file(&index_lock);
431 }
2888605c 432 commit_style = COMMIT_AS_IS;
f5bbc322
KH
433 return get_index_file();
434 }
435
2888605c
JH
436 /*
437 * A partial commit.
438 *
439 * (0) find the set of affected paths;
440 * (1) get lock on the real index file;
441 * (2) update the_index with the given paths;
442 * (3) write the_index out to the real index (still locked);
443 * (4) get lock on the false index file;
444 * (5) reset the_index from HEAD;
445 * (6) update the_index the same way as (2);
446 * (7) write the_index out to the false index file;
447 * (8) return the name of the false index file (still locked);
448 *
449 * The caller should run hooks on the locked false index, and
450 * create commit from it. Then
451 * (A) if all goes well, commit the real index;
452 * (B) on failure, rollback the real index;
453 * In either case, rollback the false index.
454 */
455 commit_style = COMMIT_PARTIAL;
456
b0cea47e
ÆAB
457 if (whence != FROM_COMMIT) {
458 if (whence == FROM_MERGE)
459 die(_("cannot do a partial commit during a merge."));
460 else if (whence == FROM_CHERRY_PICK)
461 die(_("cannot do a partial commit during a cherry-pick."));
462 }
2888605c 463
f93d7c6f 464 string_list_init(&partial, 1);
17ddc66e 465 if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
2888605c
JH
466 exit(1);
467
468 discard_cache();
469 if (read_cache() < 0)
8a6179bc 470 die(_("cannot read the index"));
2888605c 471
b3e83cc7 472 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
2888605c 473 add_remove_files(&partial);
ef12b50d 474 refresh_cache(REFRESH_QUIET);
9c4d6c02 475 update_main_cache_tree(WRITE_TREE_SILENT);
03b86647 476 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
8a6179bc 477 die(_("unable to write new_index file"));
f5bbc322 478
03b86647
NTND
479 hold_lock_file_for_update(&false_lock,
480 git_path("next-index-%"PRIuMAX,
481 (uintmax_t) getpid()),
482 LOCK_DIE_ON_ERROR);
fa9dcf80 483
06bb643b 484 create_base_index(current_head);
2888605c 485 add_remove_files(&partial);
d37d3203 486 refresh_cache(REFRESH_QUIET);
f5bbc322 487
03b86647 488 if (write_locked_index(&the_index, &false_lock, CLOSE_LOCK))
8a6179bc 489 die(_("unable to write temporary index file"));
959ba670
JK
490
491 discard_cache();
b4fb09e4
MH
492 ret = get_lock_file_path(&false_lock);
493 read_cache_from(ret);
494 return ret;
f5bbc322
KH
495}
496
d249b098
JH
497static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
498 struct wt_status *s)
f5bbc322 499{
8066df41 500 struct object_id oid;
76e2f7ce 501
d249b098
JH
502 if (s->relative_paths)
503 s->prefix = prefix;
f5bbc322
KH
504
505 if (amend) {
d249b098
JH
506 s->amend = 1;
507 s->reference = "HEAD^1";
f5bbc322 508 }
d249b098
JH
509 s->verbose = verbose;
510 s->index_file = index_file;
511 s->fp = fp;
512 s->nowarn = nowarn;
8066df41 513 s->is_initial = get_sha1(s->reference, oid.hash) ? 1 : 0;
d9fc746c 514 if (!s->is_initial)
8066df41 515 hashcpy(s->sha1_commit, oid.hash);
be7e795e
JH
516 s->status_format = status_format;
517 s->ignore_submodule_arg = ignore_submodule_arg;
f5bbc322 518
76e2f7ce 519 wt_status_collect(s);
be7e795e 520 wt_status_print(s);
f5bbc322 521
d249b098 522 return s->commitable;
f5bbc322
KH
523}
524
06bb643b 525static int is_a_merge(const struct commit *current_head)
ec84bd00 526{
06bb643b 527 return !!(current_head->parents && current_head->parents->next);
ec84bd00
PB
528}
529
fac90838
JK
530static void assert_split_ident(struct ident_split *id, const struct strbuf *buf)
531{
c83a5099 532 if (split_ident_line(id, buf->buf, buf->len) || !id->date_begin)
fac90838
JK
533 die("BUG: unable to parse our own ident: %s", buf->buf);
534}
535
7dfe8ad6
JH
536static void export_one(const char *var, const char *s, const char *e, int hack)
537{
538 struct strbuf buf = STRBUF_INIT;
539 if (hack)
540 strbuf_addch(&buf, hack);
541 strbuf_addf(&buf, "%.*s", (int)(e - s), s);
542 setenv(var, buf.buf, 1);
543 strbuf_release(&buf);
544}
545
c33ddc2e 546static int parse_force_date(const char *in, struct strbuf *out)
14ac2864 547{
c33ddc2e 548 strbuf_addch(out, '@');
14ac2864 549
c33ddc2e 550 if (parse_date(in, out) < 0) {
14ac2864
JK
551 int errors = 0;
552 unsigned long t = approxidate_careful(in, &errors);
553 if (errors)
554 return -1;
c33ddc2e 555 strbuf_addf(out, "%lu", t);
14ac2864
JK
556 }
557
558 return 0;
559}
560
f4ef5173
JK
561static void set_ident_var(char **buf, char *val)
562{
563 free(*buf);
564 *buf = val;
565}
566
4c28e4ad 567static void determine_author_info(struct strbuf *author_ident)
a45d46ba
SB
568{
569 char *name, *email, *date;
7dfe8ad6 570 struct ident_split author;
a45d46ba 571
eaa541eb
JK
572 name = xstrdup_or_null(getenv("GIT_AUTHOR_NAME"));
573 email = xstrdup_or_null(getenv("GIT_AUTHOR_EMAIL"));
574 date = xstrdup_or_null(getenv("GIT_AUTHOR_DATE"));
a45d46ba 575
37f7a857 576 if (author_message) {
f0f9662a 577 struct ident_split ident;
2c733fb2 578 size_t len;
f0f9662a 579 const char *a;
a45d46ba 580
f0f9662a 581 a = find_commit_header(author_message_buffer, "author", &len);
a45d46ba 582 if (!a)
f0f9662a
JK
583 die(_("commit '%s' lacks author header"), author_message);
584 if (split_ident_line(&ident, a, len) < 0)
585 die(_("commit '%s' has malformed author line"), author_message);
586
f4ef5173
JK
587 set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
588 set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
589
f0f9662a 590 if (ident.date_begin) {
f4ef5173 591 struct strbuf date_buf = STRBUF_INIT;
f0f9662a
JK
592 strbuf_addch(&date_buf, '@');
593 strbuf_add(&date_buf, ident.date_begin, ident.date_end - ident.date_begin);
594 strbuf_addch(&date_buf, ' ');
595 strbuf_add(&date_buf, ident.tz_begin, ident.tz_end - ident.tz_begin);
f4ef5173 596 set_ident_var(&date, strbuf_detach(&date_buf, NULL));
f0f9662a 597 }
a45d46ba
SB
598 }
599
600 if (force_author) {
f0f9662a 601 struct ident_split ident;
a45d46ba 602
f0f9662a 603 if (split_ident_line(&ident, force_author, strlen(force_author)) < 0)
8a6179bc 604 die(_("malformed --author parameter"));
f4ef5173
JK
605 set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
606 set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
a45d46ba
SB
607 }
608
14ac2864 609 if (force_date) {
f4ef5173 610 struct strbuf date_buf = STRBUF_INIT;
c33ddc2e 611 if (parse_force_date(force_date, &date_buf))
14ac2864 612 die(_("invalid date format: %s"), force_date);
f4ef5173 613 set_ident_var(&date, strbuf_detach(&date_buf, NULL));
14ac2864
JK
614 }
615
f9bc573f 616 strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
c83a5099
JK
617 assert_split_ident(&author, author_ident);
618 export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
619 export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
620 export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
f4ef5173
JK
621 free(name);
622 free(email);
623 free(date);
a45d46ba
SB
624}
625
b7242b8c
JK
626static int author_date_is_interesting(void)
627{
628 return author_message || force_date;
4c28e4ad
JH
629}
630
84c9dc2c
NTND
631static void adjust_comment_line_char(const struct strbuf *sb)
632{
633 char candidates[] = "#;@!$%^&|:";
634 char *candidate;
635 const char *p;
636
637 comment_line_char = candidates[0];
638 if (!memchr(sb->buf, comment_line_char, sb->len))
639 return;
640
641 p = sb->buf;
642 candidate = strchr(candidates, *p);
643 if (candidate)
644 *candidate = ' ';
645 for (p = sb->buf; *p; p++) {
646 if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
647 candidate = strchr(candidates, p[1]);
648 if (candidate)
649 *candidate = ' ';
650 }
651 }
652
653 for (p = candidates; *p == ' '; p++)
654 ;
655 if (!*p)
656 die(_("unable to select a comment character that is not used\n"
657 "in the current commit message"));
658 comment_line_char = *p;
659}
660
d249b098 661static int prepare_to_commit(const char *index_file, const char *prefix,
06bb643b 662 struct commit *current_head,
4c28e4ad
JH
663 struct wt_status *s,
664 struct strbuf *author_ident)
f5bbc322
KH
665{
666 struct stat statbuf;
4c28e4ad 667 struct strbuf committer_ident = STRBUF_INIT;
e23fd15a 668 int commitable;
f285a2d7 669 struct strbuf sb = STRBUF_INIT;
8089c85b
PB
670 const char *hook_arg1 = NULL;
671 const char *hook_arg2 = NULL;
8b1ae678 672 int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
2556b996 673 int old_display_comment_prefix;
f5bbc322 674
7dfe8ad6
JH
675 /* This checks and barfs if author is badly specified */
676 determine_author_info(author_ident);
677
15048f8a 678 if (!no_verify && run_commit_hook(use_editor, index_file, "pre-commit", NULL))
ec84bd00 679 return 0;
f5bbc322 680
89ac1223
PN
681 if (squash_message) {
682 /*
683 * Insert the proper subject line before other commit
684 * message options add their content.
685 */
686 if (use_message && !strcmp(use_message, squash_message))
687 strbuf_addstr(&sb, "squash! ");
688 else {
689 struct pretty_print_context ctx = {0};
690 struct commit *c;
691 c = lookup_commit_reference_by_name(squash_message);
692 if (!c)
8a6179bc 693 die(_("could not lookup commit %s"), squash_message);
89ac1223
PN
694 ctx.output_encoding = get_commit_output_encoding();
695 format_commit_message(c, "squash! %s\n\n", &sb,
696 &ctx);
697 }
698 }
699
27014cbc 700 if (have_option_m) {
f9568530 701 strbuf_addbuf(&sb, &message);
8089c85b 702 hook_arg1 = "message";
f5bbc322
KH
703 } else if (logfile && !strcmp(logfile, "-")) {
704 if (isatty(0))
8a6179bc 705 fprintf(stderr, _("(reading log message from standard input)\n"));
f5bbc322 706 if (strbuf_read(&sb, 0, 0) < 0)
8a6179bc 707 die_errno(_("could not read log from standard input"));
8089c85b 708 hook_arg1 = "message";
f5bbc322
KH
709 } else if (logfile) {
710 if (strbuf_read_file(&sb, logfile, 0) < 0)
8a6179bc 711 die_errno(_("could not read log file '%s'"),
d824cbba 712 logfile);
8089c85b 713 hook_arg1 = "message";
f5bbc322 714 } else if (use_message) {
e23fd15a 715 char *buffer;
f5bbc322 716 buffer = strstr(use_message_buffer, "\n\n");
076cbd63 717 if (buffer)
84e213a3 718 strbuf_addstr(&sb, skip_blank_lines(buffer + 2));
8089c85b
PB
719 hook_arg1 = "commit";
720 hook_arg2 = use_message;
d71b8ba7
PN
721 } else if (fixup_message) {
722 struct pretty_print_context ctx = {0};
723 struct commit *commit;
724 commit = lookup_commit_reference_by_name(fixup_message);
725 if (!commit)
8a6179bc 726 die(_("could not lookup commit %s"), fixup_message);
d71b8ba7
PN
727 ctx.output_encoding = get_commit_output_encoding();
728 format_commit_message(commit, "fixup! %s\n\n",
729 &sb, &ctx);
730 hook_arg1 = "message";
f932729c 731 } else if (!stat(git_path_merge_msg(), &statbuf)) {
b64c1e07
SS
732 /*
733 * prepend SQUASH_MSG here if it exists and a
734 * "merge --squash" was originally performed
735 */
736 if (!stat(git_path_squash_msg(), &statbuf)) {
737 if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
738 die_errno(_("could not read SQUASH_MSG"));
739 hook_arg1 = "squash";
740 } else
741 hook_arg1 = "merge";
f932729c 742 if (strbuf_read_file(&sb, git_path_merge_msg(), 0) < 0)
8a6179bc 743 die_errno(_("could not read MERGE_MSG"));
f932729c
JK
744 } else if (!stat(git_path_squash_msg(), &statbuf)) {
745 if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
8a6179bc 746 die_errno(_("could not read SQUASH_MSG"));
8089c85b 747 hook_arg1 = "squash";
2140b140 748 } else if (template_file) {
f5bbc322 749 if (strbuf_read_file(&sb, template_file, 0) < 0)
8a6179bc 750 die_errno(_("could not read '%s'"), template_file);
8089c85b 751 hook_arg1 = "template";
8b1ae678 752 clean_message_contents = 0;
f5bbc322
KH
753 }
754
8089c85b 755 /*
37f7a857
JS
756 * The remaining cases don't modify the template message, but
757 * just set the argument(s) to the prepare-commit-msg hook.
8089c85b 758 */
37f7a857 759 else if (whence == FROM_MERGE)
8089c85b 760 hook_arg1 = "merge";
37f7a857
JS
761 else if (whence == FROM_CHERRY_PICK) {
762 hook_arg1 = "commit";
763 hook_arg2 = "CHERRY_PICK_HEAD";
764 }
8089c85b 765
89ac1223
PN
766 if (squash_message) {
767 /*
768 * If squash_commit was used for the commit subject,
769 * then we're possibly hijacking other commit log options.
770 * Reset the hook args to tell the real story.
771 */
772 hook_arg1 = "message";
773 hook_arg2 = "";
774 }
775
e51b0dfc 776 s->fp = fopen_for_writing(git_path_commit_editmsg());
37f3012f 777 if (s->fp == NULL)
e51b0dfc 778 die_errno(_("could not open '%s'"), git_path_commit_editmsg());
f5bbc322 779
2556b996
MM
780 /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
781 old_display_comment_prefix = s->display_comment_prefix;
782 s->display_comment_prefix = 1;
783
ea9882bf
MM
784 /*
785 * Most hints are counter-productive when the commit has
786 * already started.
787 */
788 s->hints = 0;
789
8b1ae678 790 if (clean_message_contents)
63af4a84 791 strbuf_stripspace(&sb, 0);
f5bbc322 792
073bd75e 793 if (signoff)
710714aa 794 append_signoff(&sb, ignore_non_trailer(sb.buf, sb.len), 0);
f5bbc322 795
37f3012f 796 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
8a6179bc 797 die_errno(_("could not write commit template"));
13208572 798
84c9dc2c
NTND
799 if (auto_comment_line_char)
800 adjust_comment_line_char(&sb);
f5bbc322
KH
801 strbuf_release(&sb);
802
bb1ae3f6 803 /* This checks if committer ident is explicitly given */
f20f3878 804 strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
bed575e4 805 if (use_editor && include_status) {
e23fd15a
EP
806 int ident_shown = 0;
807 int saved_color_setting;
47010263
JK
808 struct ident_split ci, ai;
809
75df1f43
NTND
810 if (whence != FROM_COMMIT) {
811 if (cleanup_mode == CLEANUP_SCISSORS)
812 wt_status_add_cut_line(s->fp);
b926c0d1 813 status_printf_ln(s, GIT_COLOR_NORMAL,
b0cea47e
ÆAB
814 whence == FROM_MERGE
815 ? _("\n"
816 "It looks like you may be committing a merge.\n"
817 "If this is not correct, please remove the file\n"
818 " %s\n"
819 "and try again.\n")
820 : _("\n"
821 "It looks like you may be committing a cherry-pick.\n"
822 "If this is not correct, please remove the file\n"
823 " %s\n"
824 "and try again.\n"),
ca03e067
JK
825 whence == FROM_MERGE ?
826 git_path_merge_head() :
827 git_path_cherry_pick_head());
75df1f43 828 }
ec84bd00 829
b926c0d1 830 fprintf(s->fp, "\n");
ec84bd00 831 if (cleanup_mode == CLEANUP_ALL)
4064e665
ÆAB
832 status_printf(s, GIT_COLOR_NORMAL,
833 _("Please enter the commit message for your changes."
eff80a9f
JH
834 " Lines starting\nwith '%c' will be ignored, and an empty"
835 " message aborts the commit.\n"), comment_line_char);
75df1f43
NTND
836 else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
837 wt_status_add_cut_line(s->fp);
ec84bd00 838 else /* CLEANUP_SPACE, that is. */
4064e665
ÆAB
839 status_printf(s, GIT_COLOR_NORMAL,
840 _("Please enter the commit message for your changes."
eff80a9f
JH
841 " Lines starting\n"
842 "with '%c' will be kept; you may remove them"
843 " yourself if you want to.\n"
844 "An empty message aborts the commit.\n"), comment_line_char);
ec84bd00 845
fac90838
JK
846 /*
847 * These should never fail because they come from our own
848 * fmt_ident. They may fail the sane_ident test, but we know
849 * that the name and mail pointers will at least be valid,
850 * which is enough for our tests and printing here.
851 */
852 assert_split_ident(&ai, author_ident);
853 assert_split_ident(&ci, &committer_ident);
47010263
JK
854
855 if (ident_cmp(&ai, &ci))
b926c0d1 856 status_printf_ln(s, GIT_COLOR_NORMAL,
fe8165cd 857 _("%s"
47010263 858 "Author: %.*s <%.*s>"),
b926c0d1 859 ident_shown++ ? "" : "\n",
47010263
JK
860 (int)(ai.name_end - ai.name_begin), ai.name_begin,
861 (int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
e83dbe80 862
b7242b8c
JK
863 if (author_date_is_interesting())
864 status_printf_ln(s, GIT_COLOR_NORMAL,
865 _("%s"
866 "Date: %s"),
867 ident_shown++ ? "" : "\n",
a5481a6c 868 show_ident_date(&ai, DATE_MODE(NORMAL)));
e83dbe80 869
d6991cee 870 if (!committer_ident_sufficiently_given())
b926c0d1 871 status_printf_ln(s, GIT_COLOR_NORMAL,
fe8165cd 872 _("%s"
47010263 873 "Committer: %.*s <%.*s>"),
b926c0d1 874 ident_shown++ ? "" : "\n",
47010263
JK
875 (int)(ci.name_end - ci.name_begin), ci.name_begin,
876 (int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
bb1ae3f6 877
b3cf1b77 878 status_printf_ln(s, GIT_COLOR_NORMAL, "%s", ""); /* Add new line for clarity */
bb1ae3f6 879
d249b098
JH
880 saved_color_setting = s->use_color;
881 s->use_color = 0;
37f3012f 882 commitable = run_status(s->fp, index_file, prefix, 1, s);
d249b098 883 s->use_color = saved_color_setting;
ec84bd00 884 } else {
8066df41 885 struct object_id oid;
fbcf1184 886 const char *parent = "HEAD";
7168624c 887
7168624c 888 if (!active_nr && read_cache() < 0)
8a6179bc 889 die(_("Cannot read index"));
7168624c 890
fbcf1184
JH
891 if (amend)
892 parent = "HEAD^1";
893
8066df41 894 if (get_sha1(parent, oid.hash)) {
2c49f7ff
NTND
895 int i, ita_nr = 0;
896
897 for (i = 0; i < active_nr; i++)
898 if (ce_intent_to_add(active_cache[i]))
899 ita_nr++;
900 commitable = active_nr - ita_nr > 0;
901 } else {
c215d3d2
JL
902 /*
903 * Unless the user did explicitly request a submodule
904 * ignore mode by passing a command line option we do
905 * not ignore any changed submodule SHA-1s when
906 * comparing index and parent, no matter what is
907 * configured. Otherwise we won't commit any
908 * submodules which were manually staged, which would
909 * be really confusing.
910 */
911 int diff_flags = DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG;
912 if (ignore_submodule_arg &&
913 !strcmp(ignore_submodule_arg, "all"))
914 diff_flags |= DIFF_OPT_IGNORE_SUBMODULES;
018ec3c8 915 commitable = index_differs_from(parent, diff_flags, 1);
c215d3d2 916 }
ec84bd00 917 }
4c28e4ad 918 strbuf_release(&committer_ident);
d616a239 919
37f3012f 920 fclose(s->fp);
7168624c 921
37f7a857
JS
922 /*
923 * Reject an attempt to record a non-merge empty commit without
924 * explicit --allow-empty. In the cherry-pick case, it may be
925 * empty due to conflict resolution, which the user should okay.
926 */
927 if (!commitable && whence != FROM_MERGE && !allow_empty &&
06bb643b 928 !(amend && is_a_merge(current_head))) {
2556b996 929 s->display_comment_prefix = old_display_comment_prefix;
d249b098 930 run_status(stdout, index_file, prefix, 0, s);
f197ed2f 931 if (amend)
fc88e316 932 fputs(_(empty_amend_advice), stderr);
c17592a7 933 else if (whence == FROM_CHERRY_PICK) {
6c80cd29 934 fputs(_(empty_cherry_pick_advice), stderr);
c17592a7
JK
935 if (!sequencer_in_use)
936 fputs(_(empty_cherry_pick_advice_single), stderr);
937 else
938 fputs(_(empty_cherry_pick_advice_multi), stderr);
939 }
ec84bd00 940 return 0;
7168624c
AR
941 }
942
ec84bd00
PB
943 /*
944 * Re-read the index as pre-commit hook could have updated it,
945 * and write it out as a tree. We must do this before we invoke
946 * the editor and after we invoke run_status above.
947 */
948 discard_cache();
949 read_cache_from(index_file);
996277c5 950 if (update_main_cache_tree(0)) {
8a6179bc 951 error(_("Error building trees"));
ec84bd00 952 return 0;
7168624c 953 }
f5bbc322 954
15048f8a 955 if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
e51b0dfc 956 git_path_commit_editmsg(), hook_arg1, hook_arg2, NULL))
8089c85b 957 return 0;
f5bbc322 958
ec84bd00 959 if (use_editor) {
8d7aa4ba
EP
960 struct argv_array env = ARGV_ARRAY_INIT;
961
962 argv_array_pushf(&env, "GIT_INDEX_FILE=%s", index_file);
963 if (launch_editor(git_path_commit_editmsg(), NULL, env.argv)) {
7198203a 964 fprintf(stderr,
8a6179bc 965 _("Please supply the message using either -m or -F option.\n"));
7198203a
SB
966 exit(1);
967 }
8d7aa4ba 968 argv_array_clear(&env);
ec84bd00 969 }
f5bbc322 970
ec84bd00 971 if (!no_verify &&
e51b0dfc 972 run_commit_hook(use_editor, index_file, "commit-msg", git_path_commit_editmsg(), NULL)) {
ec84bd00
PB
973 return 0;
974 }
f5bbc322 975
ec84bd00 976 return 1;
f5bbc322
KH
977}
978
b2eda9bd 979static int rest_is_empty(struct strbuf *sb, int start)
f5bbc322 980{
b2eda9bd 981 int i, eol;
f5bbc322 982 const char *nl;
f5bbc322 983
669638fe 984 /* Check if the rest is just whitespace and Signed-off-by's. */
f5bbc322
KH
985 for (i = start; i < sb->len; i++) {
986 nl = memchr(sb->buf + i, '\n', sb->len - i);
987 if (nl)
988 eol = nl - sb->buf;
989 else
990 eol = sb->len;
991
992 if (strlen(sign_off_header) <= eol - i &&
59556548 993 starts_with(sb->buf + i, sign_off_header)) {
f5bbc322
KH
994 i = eol;
995 continue;
996 }
997 while (i < eol)
998 if (!isspace(sb->buf[i++]))
999 return 0;
1000 }
1001
1002 return 1;
1003}
1004
b2eda9bd
JH
1005/*
1006 * Find out if the message in the strbuf contains only whitespace and
1007 * Signed-off-by lines.
1008 */
1009static int message_is_empty(struct strbuf *sb)
1010{
1011 if (cleanup_mode == CLEANUP_NONE && sb->len)
1012 return 0;
1013 return rest_is_empty(sb, 0);
1014}
1015
1016/*
1017 * See if the user edited the message in the editor or left what
1018 * was in the template intact
1019 */
1020static int template_untouched(struct strbuf *sb)
1021{
1022 struct strbuf tmpl = STRBUF_INIT;
cf4fff57 1023 const char *start;
b2eda9bd
JH
1024
1025 if (cleanup_mode == CLEANUP_NONE && sb->len)
1026 return 0;
1027
1028 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1029 return 0;
1030
63af4a84 1031 strbuf_stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
cf4fff57 1032 if (!skip_prefix(sb->buf, tmpl.buf, &start))
b2eda9bd
JH
1033 start = sb->buf;
1034 strbuf_release(&tmpl);
1035 return rest_is_empty(sb, start - sb->buf);
1036}
1037
146ea068
JH
1038static const char *find_author_by_nickname(const char *name)
1039{
1040 struct rev_info revs;
1041 struct commit *commit;
1042 struct strbuf buf = STRBUF_INIT;
ea16794e 1043 struct string_list mailmap = STRING_LIST_INIT_NODUP;
146ea068
JH
1044 const char *av[20];
1045 int ac = 0;
1046
1047 init_revisions(&revs, NULL);
1048 strbuf_addf(&buf, "--author=%s", name);
1049 av[++ac] = "--all";
1050 av[++ac] = "-i";
1051 av[++ac] = buf.buf;
1052 av[++ac] = NULL;
1053 setup_revisions(ac, av, &revs, NULL);
ea16794e
AP
1054 revs.mailmap = &mailmap;
1055 read_mailmap(revs.mailmap, NULL);
1056
81c3ce3c
SB
1057 if (prepare_revision_walk(&revs))
1058 die(_("revision walk setup failed"));
146ea068
JH
1059 commit = get_revision(&revs);
1060 if (commit) {
dd2e794a 1061 struct pretty_print_context ctx = {0};
a5481a6c 1062 ctx.date_mode.type = DATE_NORMAL;
146ea068 1063 strbuf_release(&buf);
ea16794e
AP
1064 format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
1065 clear_mailmap(&mailmap);
146ea068
JH
1066 return strbuf_detach(&buf, NULL);
1067 }
1044b1f6 1068 die(_("--author '%s' is not 'Name <email>' and matches no existing author"), name);
146ea068
JH
1069}
1070
76e2f7ce
JH
1071
1072static void handle_untracked_files_arg(struct wt_status *s)
1073{
1074 if (!untracked_files_arg)
1075 ; /* default already initialized */
1076 else if (!strcmp(untracked_files_arg, "no"))
1077 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1078 else if (!strcmp(untracked_files_arg, "normal"))
1079 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1080 else if (!strcmp(untracked_files_arg, "all"))
1081 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1082 else
8a6179bc 1083 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
76e2f7ce
JH
1084}
1085
37f7a857
JS
1086static const char *read_commit_message(const char *name)
1087{
dd0d388c 1088 const char *out_enc;
37f7a857
JS
1089 struct commit *commit;
1090
1091 commit = lookup_commit_reference_by_name(name);
1092 if (!commit)
6c80cd29 1093 die(_("could not lookup commit %s"), name);
37f7a857 1094 out_enc = get_commit_output_encoding();
5a10d236 1095 return logmsg_reencode(commit, NULL, out_enc);
37f7a857
JS
1096}
1097
84b4202d
JH
1098/*
1099 * Enumerate what needs to be propagated when --porcelain
1100 * is not in effect here.
1101 */
1102static struct status_deferred_config {
be7e795e 1103 enum wt_status_format status_format;
84b4202d
JH
1104 int show_branch;
1105} status_deferred_config = {
1106 STATUS_FORMAT_UNSPECIFIED,
1107 -1 /* unspecified */
1108};
1109
1110static void finalize_deferred_config(struct wt_status *s)
1111{
1112 int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
1ecdecce 1113 status_format != STATUS_FORMAT_PORCELAIN_V2 &&
84b4202d
JH
1114 !s->null_termination);
1115
1116 if (s->null_termination) {
1117 if (status_format == STATUS_FORMAT_NONE ||
1118 status_format == STATUS_FORMAT_UNSPECIFIED)
1119 status_format = STATUS_FORMAT_PORCELAIN;
1120 else if (status_format == STATUS_FORMAT_LONG)
1121 die(_("--long and -z are incompatible"));
1122 }
1123
1124 if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED)
1125 status_format = status_deferred_config.status_format;
1126 if (status_format == STATUS_FORMAT_UNSPECIFIED)
1127 status_format = STATUS_FORMAT_NONE;
1128
1129 if (use_deferred_config && s->show_branch < 0)
1130 s->show_branch = status_deferred_config.show_branch;
1131 if (s->show_branch < 0)
1132 s->show_branch = 0;
1133}
1134
2f02b25f 1135static int parse_and_validate_options(int argc, const char *argv[],
036dbbfb 1136 const struct option *options,
dbd0f5c7 1137 const char * const usage[],
d249b098 1138 const char *prefix,
06bb643b 1139 struct commit *current_head,
d249b098 1140 struct wt_status *s)
f5bbc322
KH
1141{
1142 int f = 0;
1143
036dbbfb 1144 argc = parse_options(argc, argv, prefix, options, usage, 0);
84b4202d 1145 finalize_deferred_config(s);
f5bbc322 1146
146ea068
JH
1147 if (force_author && !strchr(force_author, '>'))
1148 force_author = find_author_by_nickname(force_author);
1149
c51f6cee 1150 if (force_author && renew_authorship)
8a6179bc 1151 die(_("Using both --reset-author and --author does not make sense"));
c51f6cee 1152
25206778 1153 if (logfile || have_option_m || use_message || fixup_message)
4803466f 1154 use_editor = 0;
ca1ba201
JH
1155 if (0 <= edit_flag)
1156 use_editor = edit_flag;
f5bbc322 1157
f5bbc322 1158 /* Sanity check options */
06bb643b 1159 if (amend && !current_head)
8a6179bc 1160 die(_("You have nothing to amend."));
b0cea47e
ÆAB
1161 if (amend && whence != FROM_COMMIT) {
1162 if (whence == FROM_MERGE)
1163 die(_("You are in the middle of a merge -- cannot amend."));
1164 else if (whence == FROM_CHERRY_PICK)
1165 die(_("You are in the middle of a cherry-pick -- cannot amend."));
1166 }
89ac1223 1167 if (fixup_message && squash_message)
9c227655 1168 die(_("Options --squash and --fixup cannot be used together"));
f5bbc322
KH
1169 if (use_message)
1170 f++;
1171 if (edit_message)
1172 f++;
d71b8ba7
PN
1173 if (fixup_message)
1174 f++;
f5bbc322
KH
1175 if (logfile)
1176 f++;
1177 if (f > 1)
8a6179bc 1178 die(_("Only one of -c/-C/-F/--fixup can be used."));
27014cbc 1179 if (have_option_m && f > 0)
8a6179bc 1180 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
27014cbc 1181 if (f || have_option_m)
010c7dbc 1182 template_file = NULL;
f5bbc322
KH
1183 if (edit_message)
1184 use_message = edit_message;
d71b8ba7 1185 if (amend && !use_message && !fixup_message)
f5bbc322 1186 use_message = "HEAD";
37f7a857 1187 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
8a6179bc 1188 die(_("--reset-author can be used only with -C, -c or --amend."));
f5bbc322 1189 if (use_message) {
37f7a857
JS
1190 use_message_buffer = read_commit_message(use_message);
1191 if (!renew_authorship) {
1192 author_message = use_message;
1193 author_message_buffer = use_message_buffer;
1194 }
1195 }
1196 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1197 author_message = "CHERRY_PICK_HEAD";
1198 author_message_buffer = read_commit_message(author_message);
f5bbc322
KH
1199 }
1200
b4bd4668
CI
1201 if (patch_interactive)
1202 interactive = 1;
1203
05efb7b7 1204 if (also + only + all + interactive > 1)
b4bd4668 1205 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
319d8352 1206 if (argc == 0 && (also || (only && !amend && !allow_empty)))
8a6179bc 1207 die(_("No paths with --include/--only does not make sense."));
5f065737
AR
1208 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1209 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1210 else if (!strcmp(cleanup_arg, "verbatim"))
1211 cleanup_mode = CLEANUP_NONE;
1212 else if (!strcmp(cleanup_arg, "whitespace"))
1213 cleanup_mode = CLEANUP_SPACE;
1214 else if (!strcmp(cleanup_arg, "strip"))
1215 cleanup_mode = CLEANUP_ALL;
75df1f43
NTND
1216 else if (!strcmp(cleanup_arg, "scissors"))
1217 cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
5f065737 1218 else
8a6179bc 1219 die(_("Invalid cleanup mode %s"), cleanup_arg);
f5bbc322 1220
76e2f7ce 1221 handle_untracked_files_arg(s);
4bfee30a 1222
f5bbc322 1223 if (all && argc > 0)
8a6179bc 1224 die(_("Paths with -a does not make sense."));
f5bbc322 1225
f3f47a1e 1226 if (status_format != STATUS_FORMAT_NONE)
7c9f7038
JK
1227 dry_run = 1;
1228
f5bbc322
KH
1229 return argc;
1230}
1231
d249b098 1232static int dry_run_commit(int argc, const char **argv, const char *prefix,
06bb643b 1233 const struct commit *current_head, struct wt_status *s)
f5bbc322 1234{
f5bbc322 1235 int commitable;
3a5d13a3 1236 const char *index_file;
f5bbc322 1237
06bb643b 1238 index_file = prepare_index(argc, argv, prefix, current_head, 1);
d249b098 1239 commitable = run_status(stdout, index_file, prefix, 0, s);
3a5d13a3 1240 rollback_index_files();
f5bbc322 1241
3a5d13a3
JH
1242 return commitable ? 0 : 1;
1243}
1244
8852117a 1245static int parse_status_slot(const char *slot)
f766b367 1246{
8852117a 1247 if (!strcasecmp(slot, "header"))
f766b367 1248 return WT_STATUS_HEADER;
8852117a 1249 if (!strcasecmp(slot, "branch"))
1d282327 1250 return WT_STATUS_ONBRANCH;
8852117a 1251 if (!strcasecmp(slot, "updated") || !strcasecmp(slot, "added"))
f766b367 1252 return WT_STATUS_UPDATED;
8852117a 1253 if (!strcasecmp(slot, "changed"))
f766b367 1254 return WT_STATUS_CHANGED;
8852117a 1255 if (!strcasecmp(slot, "untracked"))
f766b367 1256 return WT_STATUS_UNTRACKED;
8852117a 1257 if (!strcasecmp(slot, "nobranch"))
f766b367 1258 return WT_STATUS_NOBRANCH;
8852117a 1259 if (!strcasecmp(slot, "unmerged"))
f766b367 1260 return WT_STATUS_UNMERGED;
93fdf301
SK
1261 if (!strcasecmp(slot, "localBranch"))
1262 return WT_STATUS_LOCAL_BRANCH;
1263 if (!strcasecmp(slot, "remoteBranch"))
1264 return WT_STATUS_REMOTE_BRANCH;
8b8e8624 1265 return -1;
f766b367
JH
1266}
1267
1268static int git_status_config(const char *k, const char *v, void *cb)
1269{
1270 struct wt_status *s = cb;
e3f1da98 1271 const char *slot_name;
f766b367 1272
59556548 1273 if (starts_with(k, "column."))
4d2292e9 1274 return git_column_config(k, v, "status", &s->colopts);
f766b367
JH
1275 if (!strcmp(k, "status.submodulesummary")) {
1276 int is_bool;
1277 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1278 if (is_bool && s->submodule_summary)
1279 s->submodule_summary = -1;
1280 return 0;
1281 }
4fb5166a
JJGG
1282 if (!strcmp(k, "status.short")) {
1283 if (git_config_bool(k, v))
84b4202d 1284 status_deferred_config.status_format = STATUS_FORMAT_SHORT;
4fb5166a 1285 else
84b4202d 1286 status_deferred_config.status_format = STATUS_FORMAT_NONE;
4fb5166a
JJGG
1287 return 0;
1288 }
ec85d070 1289 if (!strcmp(k, "status.branch")) {
84b4202d 1290 status_deferred_config.show_branch = git_config_bool(k, v);
ec85d070
JJGG
1291 return 0;
1292 }
c1b5d019
LB
1293 if (!strcmp(k, "status.showstash")) {
1294 s->show_stash = git_config_bool(k, v);
1295 return 0;
1296 }
f766b367 1297 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
e269eb79 1298 s->use_color = git_config_colorbool(k, v);
f766b367
JH
1299 return 0;
1300 }
2556b996
MM
1301 if (!strcmp(k, "status.displaycommentprefix")) {
1302 s->display_comment_prefix = git_config_bool(k, v);
1303 return 0;
1304 }
e3f1da98
RS
1305 if (skip_prefix(k, "status.color.", &slot_name) ||
1306 skip_prefix(k, "color.status.", &slot_name)) {
b9465768 1307 int slot = parse_status_slot(slot_name);
8b8e8624
JK
1308 if (slot < 0)
1309 return 0;
f766b367
JH
1310 if (!v)
1311 return config_error_nonbool(k);
f6c5a296 1312 return color_parse(v, s->color_palette[slot]);
f766b367
JH
1313 }
1314 if (!strcmp(k, "status.relativepaths")) {
1315 s->relative_paths = git_config_bool(k, v);
1316 return 0;
1317 }
1318 if (!strcmp(k, "status.showuntrackedfiles")) {
1319 if (!v)
1320 return config_error_nonbool(k);
1321 else if (!strcmp(v, "no"))
1322 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1323 else if (!strcmp(v, "normal"))
1324 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1325 else if (!strcmp(v, "all"))
1326 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1327 else
8a6179bc 1328 return error(_("Invalid untracked files mode '%s'"), v);
f766b367
JH
1329 return 0;
1330 }
1331 return git_diff_ui_config(k, v, NULL);
1332}
1333
3a5d13a3
JH
1334int cmd_status(int argc, const char **argv, const char *prefix)
1335{
036dbbfb 1336 static struct wt_status s;
4bb6644d 1337 int fd;
8066df41 1338 struct object_id oid;
9e4b7ab6 1339 static struct option builtin_status_options[] = {
f2276316 1340 OPT__VERBOSE(&verbose, N_("be verbose")),
dd2be243 1341 OPT_SET_INT('s', "short", &status_format,
f2276316 1342 N_("show status concisely"), STATUS_FORMAT_SHORT),
84b4202d
JH
1343 OPT_BOOL('b', "branch", &s.show_branch,
1344 N_("show branch information")),
c1b5d019
LB
1345 OPT_BOOL(0, "show-stash", &s.show_stash,
1346 N_("show stash information")),
c4f596b9
JH
1347 { OPTION_CALLBACK, 0, "porcelain", &status_format,
1348 N_("version"), N_("machine-readable output"),
1349 PARSE_OPT_OPTARG, opt_parse_porcelain },
f3f47a1e
JK
1350 OPT_SET_INT(0, "long", &status_format,
1351 N_("show status in long format (default)"),
1352 STATUS_FORMAT_LONG),
d5d09d47
SB
1353 OPT_BOOL('z', "null", &s.null_termination,
1354 N_("terminate entries with NUL")),
76e2f7ce 1355 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
f2276316
NTND
1356 N_("mode"),
1357 N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
76e2f7ce 1358 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
d5d09d47
SB
1359 OPT_BOOL(0, "ignored", &show_ignored_in_status,
1360 N_("show ignored files")),
f2276316
NTND
1361 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
1362 N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
46a958b3 1363 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
9c23f4c5 1364 OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
76e2f7ce
JH
1365 OPT_END(),
1366 };
1367
5d3dd915
NTND
1368 if (argc == 2 && !strcmp(argv[1], "-h"))
1369 usage_with_options(builtin_status_usage, builtin_status_options);
1370
5c25dfaa 1371 status_init_config(&s, git_status_config);
76e2f7ce 1372 argc = parse_options(argc, argv, prefix,
9e4b7ab6
JH
1373 builtin_status_options,
1374 builtin_status_usage, 0);
4d2292e9 1375 finalize_colopts(&s.colopts, -1);
84b4202d 1376 finalize_deferred_config(&s);
000f97bd 1377
76e2f7ce 1378 handle_untracked_files_arg(&s);
2381e39e
JH
1379 if (show_ignored_in_status)
1380 s.show_ignored_files = 1;
15b55ae0
NTND
1381 parse_pathspec(&s.pathspec, 0,
1382 PATHSPEC_PREFER_FULL,
1383 prefix, argv);
76e2f7ce 1384
5ab2a2da 1385 read_cache_preload(&s.pathspec);
9b2d6149 1386 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
4bb6644d
MH
1387
1388 fd = hold_locked_index(&index_lock, 0);
4bb6644d 1389
8066df41 1390 s.is_initial = get_sha1(s.reference, oid.hash) ? 1 : 0;
d9fc746c 1391 if (!s.is_initial)
8066df41 1392 hashcpy(s.sha1_commit, oid.hash);
d9fc746c 1393
46a958b3 1394 s.ignore_submodule_arg = ignore_submodule_arg;
be7e795e
JH
1395 s.status_format = status_format;
1396 s.verbose = verbose;
1397
76e2f7ce
JH
1398 wt_status_collect(&s);
1399
226c051a
NTND
1400 if (0 <= fd)
1401 update_index_if_able(&the_index, &index_lock);
1402
8661768f
JK
1403 if (s.relative_paths)
1404 s.prefix = prefix;
38920dd6 1405
be7e795e 1406 wt_status_print(&s);
76e2f7ce 1407 return 0;
f5bbc322
KH
1408}
1409
8b27ff7e
MM
1410static const char *implicit_ident_advice(void)
1411{
4aad2f16 1412 char *user_config = expand_user_path("~/.gitconfig", 0);
e682c9db
PT
1413 char *xdg_config = xdg_config_home("config");
1414 int config_exists = file_exists(user_config) || file_exists(xdg_config);
8b27ff7e 1415
8b27ff7e
MM
1416 free(user_config);
1417 free(xdg_config);
1418
1419 if (config_exists)
1420 return _(implicit_ident_advice_config);
1421 else
1422 return _(implicit_ident_advice_noconfig);
1423
1424}
1425
8066df41 1426static void print_summary(const char *prefix, const struct object_id *oid,
06bb643b 1427 int initial_commit)
f5bbc322
KH
1428{
1429 struct rev_info rev;
1430 struct commit *commit;
49ff9a7a 1431 struct strbuf format = STRBUF_INIT;
8066df41 1432 struct object_id junk_oid;
d5a35c11 1433 const char *head;
49ff9a7a
JK
1434 struct pretty_print_context pctx = {0};
1435 struct strbuf author_ident = STRBUF_INIT;
1436 struct strbuf committer_ident = STRBUF_INIT;
f5bbc322 1437
bc83266a 1438 commit = lookup_commit(oid);
f5bbc322 1439 if (!commit)
8a6179bc 1440 die(_("couldn't look up newly created commit"));
5e7d4d3e 1441 if (parse_commit(commit))
8a6179bc 1442 die(_("could not parse newly created commit"));
f5bbc322 1443
49ff9a7a
JK
1444 strbuf_addstr(&format, "format:%h] %s");
1445
1446 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1447 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1448 if (strbuf_cmp(&author_ident, &committer_ident)) {
1449 strbuf_addstr(&format, "\n Author: ");
1450 strbuf_addbuf_percentquote(&format, &author_ident);
1451 }
b7242b8c
JK
1452 if (author_date_is_interesting()) {
1453 struct strbuf date = STRBUF_INIT;
1454 format_commit_message(commit, "%ad", &date, &pctx);
1455 strbuf_addstr(&format, "\n Date: ");
1456 strbuf_addbuf_percentquote(&format, &date);
1457 strbuf_release(&date);
1458 }
d6991cee 1459 if (!committer_ident_sufficiently_given()) {
49ff9a7a
JK
1460 strbuf_addstr(&format, "\n Committer: ");
1461 strbuf_addbuf_percentquote(&format, &committer_ident);
b706fcfe
JK
1462 if (advice_implicit_identity) {
1463 strbuf_addch(&format, '\n');
8b27ff7e 1464 strbuf_addstr(&format, implicit_ident_advice());
b706fcfe 1465 }
49ff9a7a
JK
1466 }
1467 strbuf_release(&author_ident);
1468 strbuf_release(&committer_ident);
1469
f5bbc322
KH
1470 init_revisions(&rev, prefix);
1471 setup_revisions(0, NULL, &rev, NULL);
1472
f5bbc322
KH
1473 rev.diff = 1;
1474 rev.diffopt.output_format =
1475 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1476
1477 rev.verbose_header = 1;
1478 rev.show_root_diff = 1;
49ff9a7a 1479 get_commit_format(format.buf, &rev);
bf82a150 1480 rev.always_show_header = 0;
3eb2a15e 1481 rev.diffopt.detect_rename = 1;
3eb2a15e 1482 rev.diffopt.break_opt = 0;
15964563 1483 diff_setup_done(&rev.diffopt);
f5bbc322 1484
8066df41 1485 head = resolve_ref_unsafe("HEAD", 0, junk_oid.hash, NULL);
e3f1da98
RS
1486 if (!strcmp(head, "HEAD"))
1487 head = _("detached HEAD");
1488 else
1489 skip_prefix(head, "refs/heads/", &head);
1490 printf("[%s%s ", head, initial_commit ? _(" (root-commit)") : "");
f5bbc322 1491
bf82a150 1492 if (!log_tree_commit(&rev, commit)) {
a45e1a87
TRC
1493 rev.always_show_header = 1;
1494 rev.use_terminator = 1;
1495 log_tree_commit(&rev, commit);
bf82a150 1496 }
a45e1a87 1497
fc6f19fe 1498 strbuf_release(&format);
f5bbc322
KH
1499}
1500
186458b1 1501static int git_commit_config(const char *k, const char *v, void *cb)
f5bbc322 1502{
d249b098 1503 struct wt_status *s = cb;
ba3c69a9 1504 int status;
d249b098 1505
984c6e7e 1506 if (!strcmp(k, "commit.template"))
395de250 1507 return git_config_pathname(&template_file, k, v);
bed575e4
JHI
1508 if (!strcmp(k, "commit.status")) {
1509 include_status = git_config_bool(k, v);
1510 return 0;
1511 }
51fb3a3d
RT
1512 if (!strcmp(k, "commit.cleanup"))
1513 return git_config_string(&cleanup_arg, k, v);
d95bfb12
NV
1514 if (!strcmp(k, "commit.gpgsign")) {
1515 sign_commit = git_config_bool(k, v) ? "" : NULL;
1516 return 0;
1517 }
aaab8420
PB
1518 if (!strcmp(k, "commit.verbose")) {
1519 int is_bool;
1520 config_commit_verbose = git_config_bool_or_int(k, v, &is_bool);
1521 return 0;
1522 }
f5bbc322 1523
ba3c69a9
JH
1524 status = git_gpg_config(k, v, NULL);
1525 if (status)
1526 return status;
d249b098 1527 return git_status_config(k, v, s);
f5bbc322
KH
1528}
1529
8066df41 1530static int run_rewrite_hook(const struct object_id *oldoid,
1531 const struct object_id *newoid)
6f6bee3b 1532{
d3180279 1533 struct child_process proc = CHILD_PROCESS_INIT;
6f6bee3b
TR
1534 const char *argv[3];
1535 int code;
4a528191 1536 struct strbuf sb = STRBUF_INIT;
6f6bee3b 1537
5a7da2dc
AS
1538 argv[0] = find_hook("post-rewrite");
1539 if (!argv[0])
6f6bee3b
TR
1540 return 0;
1541
6f6bee3b
TR
1542 argv[1] = "amend";
1543 argv[2] = NULL;
1544
6f6bee3b
TR
1545 proc.argv = argv;
1546 proc.in = -1;
1547 proc.stdout_to_stderr = 1;
1548
1549 code = start_command(&proc);
1550 if (code)
1551 return code;
8066df41 1552 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
af65f68c 1553 sigchain_push(SIGPIPE, SIG_IGN);
4a528191 1554 write_in_full(proc.in, sb.buf, sb.len);
6f6bee3b 1555 close(proc.in);
4a528191 1556 strbuf_release(&sb);
af65f68c 1557 sigchain_pop(SIGPIPE);
6f6bee3b
TR
1558 return finish_command(&proc);
1559}
1560
15048f8a
BP
1561int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
1562{
8d7aa4ba 1563 struct argv_array hook_env = ARGV_ARRAY_INIT;
15048f8a
BP
1564 va_list args;
1565 int ret;
1566
8d7aa4ba 1567 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", index_file);
15048f8a
BP
1568
1569 /*
1570 * Let the hook know that no editor will be launched.
1571 */
1572 if (!editor_is_used)
8d7aa4ba 1573 argv_array_push(&hook_env, "GIT_EDITOR=:");
15048f8a
BP
1574
1575 va_start(args, name);
8d7aa4ba 1576 ret = run_hook_ve(hook_env.argv,name, args);
15048f8a 1577 va_end(args);
8d7aa4ba 1578 argv_array_clear(&hook_env);
15048f8a
BP
1579
1580 return ret;
1581}
1582
f5bbc322
KH
1583int cmd_commit(int argc, const char **argv, const char *prefix)
1584{
036dbbfb
JK
1585 static struct wt_status s;
1586 static struct option builtin_commit_options[] = {
9c23f4c5
NTND
1587 OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
1588 OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
1589
1590 OPT_GROUP(N_("Commit message options")),
1591 OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
1592 OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
1593 OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
1594 OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
1595 OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
1596 OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
1597 OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
1598 OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
d5d09d47
SB
1599 OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
1600 OPT_BOOL('s', "signoff", &signoff, N_("add Signed-off-by:")),
9c23f4c5
NTND
1601 OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
1602 OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
1603 OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
d5d09d47 1604 OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
e703d711 1605 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
9c23f4c5 1606 N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
036dbbfb
JK
1607 /* end commit message options */
1608
9c23f4c5 1609 OPT_GROUP(N_("Commit contents options")),
d5d09d47
SB
1610 OPT_BOOL('a', "all", &all, N_("commit all changed files")),
1611 OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")),
1612 OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
1613 OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
1614 OPT_BOOL('o', "only", &only, N_("commit only specified files")),
def480fe 1615 OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit and commit-msg hooks")),
d5d09d47 1616 OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),
9c23f4c5 1617 OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
036dbbfb 1618 STATUS_FORMAT_SHORT),
84b4202d 1619 OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
036dbbfb 1620 OPT_SET_INT(0, "porcelain", &status_format,
9c23f4c5 1621 N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
f3f47a1e
JK
1622 OPT_SET_INT(0, "long", &status_format,
1623 N_("show status in long format (default)"),
1624 STATUS_FORMAT_LONG),
d5d09d47
SB
1625 OPT_BOOL('z', "null", &s.null_termination,
1626 N_("terminate entries with NUL")),
1627 OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
1628 OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
9c23f4c5 1629 { 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" },
036dbbfb
JK
1630 /* end commit contents options */
1631
4741edd5
SB
1632 OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
1633 N_("ok to record an empty change")),
1634 OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message,
1635 N_("ok to record a change with an empty message")),
036dbbfb
JK
1636
1637 OPT_END()
1638 };
1639
f285a2d7 1640 struct strbuf sb = STRBUF_INIT;
4c28e4ad 1641 struct strbuf author_ident = STRBUF_INIT;
f5bbc322 1642 const char *index_file, *reflog_msg;
1a72cfd7 1643 char *nl;
8066df41 1644 struct object_id oid;
de9f7fa3 1645 struct commit_list *parents = NULL;
cf10f9fd 1646 struct stat statbuf;
06bb643b 1647 struct commit *current_head = NULL;
ed7a42a0 1648 struct commit_extra_header *extra = NULL;
c0fe1ed0
RS
1649 struct ref_transaction *transaction;
1650 struct strbuf err = STRBUF_INIT;
f5bbc322 1651
5d3dd915
NTND
1652 if (argc == 2 && !strcmp(argv[1], "-h"))
1653 usage_with_options(builtin_commit_usage, builtin_commit_options);
1654
5c25dfaa 1655 status_init_config(&s, git_commit_config);
4ddb1354 1656 s.commit_template = 1;
f0915cba 1657 status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
4d2292e9 1658 s.colopts = 0;
f5bbc322 1659
8066df41 1660 if (get_sha1("HEAD", oid.hash))
06bb643b
JH
1661 current_head = NULL;
1662 else {
bc83266a 1663 current_head = lookup_commit_or_die(&oid, "HEAD");
5e7d4d3e 1664 if (parse_commit(current_head))
06bb643b
JH
1665 die(_("could not parse HEAD commit"));
1666 }
aaab8420 1667 verbose = -1; /* unspecified */
036dbbfb
JK
1668 argc = parse_and_validate_options(argc, argv, builtin_commit_options,
1669 builtin_commit_usage,
06bb643b 1670 prefix, current_head, &s);
aaab8420
PB
1671 if (verbose == -1)
1672 verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose;
1673
c9bfb953 1674 if (dry_run)
06bb643b 1675 return dry_run_commit(argc, argv, prefix, current_head, &s);
06bb643b 1676 index_file = prepare_index(argc, argv, prefix, current_head, 0);
f5bbc322 1677
ec84bd00
PB
1678 /* Set up everything for writing the commit object. This includes
1679 running hooks, writing the trees, and interacting with the user. */
06bb643b
JH
1680 if (!prepare_to_commit(index_file, prefix,
1681 current_head, &s, &author_ident)) {
2888605c 1682 rollback_index_files();
f5bbc322
KH
1683 return 1;
1684 }
1685
f5bbc322 1686 /* Determine parents */
643cb5f7 1687 reflog_msg = getenv("GIT_REFLOG_ACTION");
06bb643b 1688 if (!current_head) {
643cb5f7
CC
1689 if (!reflog_msg)
1690 reflog_msg = "commit (initial)";
f5bbc322 1691 } else if (amend) {
643cb5f7
CC
1692 if (!reflog_msg)
1693 reflog_msg = "commit (amend)";
de9f7fa3 1694 parents = copy_commit_list(current_head->parents);
37f7a857 1695 } else if (whence == FROM_MERGE) {
f285a2d7 1696 struct strbuf m = STRBUF_INIT;
f5bbc322 1697 FILE *fp;
e23fd15a 1698 int allow_fast_forward = 1;
de9f7fa3 1699 struct commit_list **pptr = &parents;
f5bbc322 1700
643cb5f7
CC
1701 if (!reflog_msg)
1702 reflog_msg = "commit (merge)";
de9f7fa3 1703 pptr = commit_list_append(current_head, pptr);
23a9e071 1704 fp = xfopen(git_path_merge_head(), "r");
8f309aeb 1705 while (strbuf_getline_lf(&m, fp) != EOF) {
5231c633
JH
1706 struct commit *parent;
1707
1708 parent = get_merge_parent(m.buf);
1709 if (!parent)
8a6179bc 1710 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
de9f7fa3 1711 pptr = commit_list_append(parent, pptr);
7c3fd25d 1712 }
f5bbc322
KH
1713 fclose(fp);
1714 strbuf_release(&m);
f932729c
JK
1715 if (!stat(git_path_merge_mode(), &statbuf)) {
1716 if (strbuf_read_file(&sb, git_path_merge_mode(), 0) < 0)
8a6179bc 1717 die_errno(_("could not read MERGE_MODE"));
cf10f9fd
MV
1718 if (!strcmp(sb.buf, "no-ff"))
1719 allow_fast_forward = 0;
1720 }
1721 if (allow_fast_forward)
1722 parents = reduce_heads(parents);
f5bbc322 1723 } else {
643cb5f7 1724 if (!reflog_msg)
37f7a857
JS
1725 reflog_msg = (whence == FROM_CHERRY_PICK)
1726 ? "commit (cherry-pick)"
1727 : "commit";
de9f7fa3 1728 commit_list_insert(current_head, &parents);
f5bbc322 1729 }
f5bbc322 1730
ec84bd00 1731 /* Finally, get the commit message */
cf10f9fd 1732 strbuf_reset(&sb);
e51b0dfc 1733 if (strbuf_read_file(&sb, git_path_commit_editmsg(), 0) < 0) {
0721c314 1734 int saved_errno = errno;
740001a5 1735 rollback_index_files();
8a6179bc 1736 die(_("could not read commit message: %s"), strerror(saved_errno));
740001a5 1737 }
99a12694 1738
75df1f43
NTND
1739 if (verbose || /* Truncate the message just before the diff, if any. */
1740 cleanup_mode == CLEANUP_SCISSORS)
d76650b8 1741 strbuf_setlen(&sb, wt_status_locate_end(sb.buf, sb.len));
5f065737 1742 if (cleanup_mode != CLEANUP_NONE)
63af4a84 1743 strbuf_stripspace(&sb, cleanup_mode == CLEANUP_ALL);
bc17f35f
KS
1744
1745 if (message_is_empty(&sb) && !allow_empty_message) {
b2eda9bd 1746 rollback_index_files();
bc17f35f 1747 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
b2eda9bd
JH
1748 exit(1);
1749 }
bc17f35f 1750 if (template_untouched(&sb) && !allow_empty_message) {
2888605c 1751 rollback_index_files();
bc17f35f 1752 fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
fdc7c811 1753 exit(1);
2888605c 1754 }
f5bbc322 1755
0074d18d 1756 if (amend) {
c871a1d1
JH
1757 const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1758 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
0074d18d
JH
1759 } else {
1760 struct commit_extra_header **tail = &extra;
1761 append_merge_tag_headers(parents, &tail);
1762 }
ed7a42a0 1763
e0a92804 1764 if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->oid.hash,
8066df41 1765 parents, oid.hash, author_ident.buf, sign_commit, extra)) {
2888605c 1766 rollback_index_files();
8a6179bc 1767 die(_("failed to write commit object"));
2888605c 1768 }
4c28e4ad 1769 strbuf_release(&author_ident);
ed7a42a0 1770 free_commit_extra_headers(extra);
f5bbc322 1771
6bb6b034 1772 nl = strchr(sb.buf, '\n');
741707b1
JS
1773 if (nl)
1774 strbuf_setlen(&sb, nl + 1 - sb.buf);
1775 else
1776 strbuf_addch(&sb, '\n');
741707b1
JS
1777 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1778 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
f5bbc322 1779
c0fe1ed0
RS
1780 transaction = ref_transaction_begin(&err);
1781 if (!transaction ||
8066df41 1782 ref_transaction_update(transaction, "HEAD", oid.hash,
c0fe1ed0 1783 current_head
ed1c9977 1784 ? current_head->object.oid.hash : null_sha1,
1d147bdf 1785 0, sb.buf, &err) ||
db7516ab 1786 ref_transaction_commit(transaction, &err)) {
2888605c 1787 rollback_index_files();
c0fe1ed0 1788 die("%s", err.buf);
2888605c 1789 }
c0fe1ed0 1790 ref_transaction_free(transaction);
f5bbc322 1791
f932729c
JK
1792 unlink(git_path_cherry_pick_head());
1793 unlink(git_path_revert_head());
1794 unlink(git_path_merge_head());
1795 unlink(git_path_merge_msg());
1796 unlink(git_path_merge_mode());
1797 unlink(git_path_squash_msg());
f5bbc322 1798
5a9dd399 1799 if (commit_index_files())
8a6179bc 1800 die (_("Repository has been updated, but unable to write\n"
ad5fe377 1801 "new_index file. Check that disk is not full and quota is\n"
8a6179bc 1802 "not exceeded, and then \"git reset HEAD\" to recover."));
f5bbc322 1803
cb6020bb 1804 rerere(0);
15048f8a 1805 run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
6f6bee3b 1806 if (amend && !no_post_rewrite) {
6360d343
TR
1807 struct notes_rewrite_cfg *cfg;
1808 cfg = init_copy_notes_for_rewrite("amend");
1809 if (cfg) {
06bb643b 1810 /* we are amending, so current_head is not NULL */
bb7e4739 1811 copy_note_for_rewrite(cfg, &current_head->object.oid, &oid);
80a14665 1812 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
6360d343 1813 }
8066df41 1814 run_rewrite_hook(&current_head->object.oid, &oid);
6f6bee3b 1815 }
f5bbc322 1816 if (!quiet)
8066df41 1817 print_summary(prefix, &oid, !current_head);
f5bbc322 1818
c0fe1ed0 1819 strbuf_release(&err);
f5bbc322
KH
1820 return 0;
1821}