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