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