Merge branch 'va/p4-branch-import'
[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
30 static const char * const builtin_commit_usage[] = {
31         "git commit [options] [--] <filepattern>...",
32         NULL
33 };
34
35 static const char * const builtin_status_usage[] = {
36         "git status [options] [--] <filepattern>...",
37         NULL
38 };
39
40 static const char implicit_ident_advice[] =
41 N_("Your name and email address were configured automatically based\n"
42 "on your username and hostname. Please check that they are accurate.\n"
43 "You can suppress this message by setting them explicitly:\n"
44 "\n"
45 "    git config --global user.name \"Your Name\"\n"
46 "    git config --global user.email you@example.com\n"
47 "\n"
48 "After doing this, you may fix the identity used for this commit with:\n"
49 "\n"
50 "    git commit --amend --reset-author\n");
51
52 static const char empty_amend_advice[] =
53 N_("You asked to amend the most recent commit, but doing so would make\n"
54 "it empty. You can repeat your command with --allow-empty, or you can\n"
55 "remove the commit entirely with \"git reset HEAD^\".\n");
56
57 static const char empty_cherry_pick_advice[] =
58 N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
59 "If you wish to commit it anyway, use:\n"
60 "\n"
61 "    git commit --allow-empty\n"
62 "\n"
63 "Otherwise, please use 'git reset'\n");
64
65 static const char *use_message_buffer;
66 static const char commit_editmsg[] = "COMMIT_EDITMSG";
67 static struct lock_file index_lock; /* real index */
68 static struct lock_file false_lock; /* used only for partial commits */
69 static enum {
70         COMMIT_AS_IS = 1,
71         COMMIT_NORMAL,
72         COMMIT_PARTIAL
73 } commit_style;
74
75 static const char *logfile, *force_author;
76 static const char *template_file;
77 /*
78  * The _message variables are commit names from which to take
79  * the commit message and/or authorship.
80  */
81 static const char *author_message, *author_message_buffer;
82 static char *edit_message, *use_message;
83 static char *fixup_message, *squash_message;
84 static int all, edit_flag, also, interactive, patch_interactive, only, amend, signoff;
85 static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
86 static int no_post_rewrite, allow_empty_message;
87 static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
88 /*
89  * The default commit message cleanup mode will remove the lines
90  * beginning with # (shell comments) and leading and trailing
91  * whitespaces (empty lines or containing only whitespaces)
92  * if editor is used, and only the whitespaces if the message
93  * is specified explicitly.
94  */
95 static enum {
96         CLEANUP_SPACE,
97         CLEANUP_NONE,
98         CLEANUP_ALL
99 } cleanup_mode;
100 static char *cleanup_arg;
101
102 static enum commit_whence whence;
103 static int use_editor = 1, include_status = 1;
104 static int show_ignored_in_status;
105 static const char *only_include_assumed;
106 static struct strbuf message;
107
108 static int null_termination;
109 static enum {
110         STATUS_FORMAT_LONG,
111         STATUS_FORMAT_SHORT,
112         STATUS_FORMAT_PORCELAIN
113 } status_format = STATUS_FORMAT_LONG;
114 static int status_show_branch;
115
116 static int opt_parse_m(const struct option *opt, const char *arg, int unset)
117 {
118         struct strbuf *buf = opt->value;
119         if (unset)
120                 strbuf_setlen(buf, 0);
121         else {
122                 strbuf_addstr(buf, arg);
123                 strbuf_addstr(buf, "\n\n");
124         }
125         return 0;
126 }
127
128 static struct option builtin_commit_options[] = {
129         OPT__QUIET(&quiet, "suppress summary after successful commit"),
130         OPT__VERBOSE(&verbose, "show diff in commit message template"),
131
132         OPT_GROUP("Commit message options"),
133         OPT_FILENAME('F', "file", &logfile, "read message from file"),
134         OPT_STRING(0, "author", &force_author, "author", "override author for commit"),
135         OPT_STRING(0, "date", &force_date, "date", "override date for commit"),
136         OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m),
137         OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"),
138         OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"),
139         OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"),
140         OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"),
141         OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C-c/--amend)"),
142         OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
143         OPT_FILENAME('t', "template", &template_file, "use specified template file"),
144         OPT_BOOLEAN('e', "edit", &edit_flag, "force edit of commit"),
145         OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
146         OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
147         /* end commit message options */
148
149         OPT_GROUP("Commit contents options"),
150         OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
151         OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
152         OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
153         OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"),
154         OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
155         OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
156         OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
157         OPT_SET_INT(0, "short", &status_format, "show status concisely",
158                     STATUS_FORMAT_SHORT),
159         OPT_BOOLEAN(0, "branch", &status_show_branch, "show branch information"),
160         OPT_SET_INT(0, "porcelain", &status_format,
161                     "machine-readable output", STATUS_FORMAT_PORCELAIN),
162         OPT_BOOLEAN('z', "null", &null_termination,
163                     "terminate entries with NUL"),
164         OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
165         OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
166         { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
167         /* end commit contents options */
168
169         { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
170           "ok to record an empty change",
171           PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
172         { OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
173           "ok to record a change with an empty message",
174           PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
175
176         OPT_END()
177 };
178
179 static void determine_whence(struct wt_status *s)
180 {
181         if (file_exists(git_path("MERGE_HEAD")))
182                 whence = FROM_MERGE;
183         else if (file_exists(git_path("CHERRY_PICK_HEAD")))
184                 whence = FROM_CHERRY_PICK;
185         else
186                 whence = FROM_COMMIT;
187         if (s)
188                 s->whence = whence;
189 }
190
191 static const char *whence_s(void)
192 {
193         char *s = "";
194
195         switch (whence) {
196         case FROM_COMMIT:
197                 break;
198         case FROM_MERGE:
199                 s = "merge";
200                 break;
201         case FROM_CHERRY_PICK:
202                 s = "cherry-pick";
203                 break;
204         }
205
206         return s;
207 }
208
209 static void rollback_index_files(void)
210 {
211         switch (commit_style) {
212         case COMMIT_AS_IS:
213                 break; /* nothing to do */
214         case COMMIT_NORMAL:
215                 rollback_lock_file(&index_lock);
216                 break;
217         case COMMIT_PARTIAL:
218                 rollback_lock_file(&index_lock);
219                 rollback_lock_file(&false_lock);
220                 break;
221         }
222 }
223
224 static int commit_index_files(void)
225 {
226         int err = 0;
227
228         switch (commit_style) {
229         case COMMIT_AS_IS:
230                 break; /* nothing to do */
231         case COMMIT_NORMAL:
232                 err = commit_lock_file(&index_lock);
233                 break;
234         case COMMIT_PARTIAL:
235                 err = commit_lock_file(&index_lock);
236                 rollback_lock_file(&false_lock);
237                 break;
238         }
239
240         return err;
241 }
242
243 /*
244  * Take a union of paths in the index and the named tree (typically, "HEAD"),
245  * and return the paths that match the given pattern in list.
246  */
247 static int list_paths(struct string_list *list, const char *with_tree,
248                       const char *prefix, const char **pattern)
249 {
250         int i;
251         char *m;
252
253         for (i = 0; pattern[i]; i++)
254                 ;
255         m = xcalloc(1, i);
256
257         if (with_tree) {
258                 const char *max_prefix = pathspec_prefix(prefix, pattern);
259                 overlay_tree_on_cache(with_tree, max_prefix);
260         }
261
262         for (i = 0; i < active_nr; i++) {
263                 struct cache_entry *ce = active_cache[i];
264                 struct string_list_item *item;
265
266                 if (ce->ce_flags & CE_UPDATE)
267                         continue;
268                 if (!match_pathspec(pattern, ce->name, ce_namelen(ce), 0, m))
269                         continue;
270                 item = string_list_insert(list, ce->name);
271                 if (ce_skip_worktree(ce))
272                         item->util = item; /* better a valid pointer than a fake one */
273         }
274
275         return report_path_error(m, pattern, prefix);
276 }
277
278 static void add_remove_files(struct string_list *list)
279 {
280         int i;
281         for (i = 0; i < list->nr; i++) {
282                 struct stat st;
283                 struct string_list_item *p = &(list->items[i]);
284
285                 /* p->util is skip-worktree */
286                 if (p->util)
287                         continue;
288
289                 if (!lstat(p->string, &st)) {
290                         if (add_to_cache(p->string, &st, 0))
291                                 die(_("updating files failed"));
292                 } else
293                         remove_file_from_cache(p->string);
294         }
295 }
296
297 static void create_base_index(const struct commit *current_head)
298 {
299         struct tree *tree;
300         struct unpack_trees_options opts;
301         struct tree_desc t;
302
303         if (!current_head) {
304                 discard_cache();
305                 return;
306         }
307
308         memset(&opts, 0, sizeof(opts));
309         opts.head_idx = 1;
310         opts.index_only = 1;
311         opts.merge = 1;
312         opts.src_index = &the_index;
313         opts.dst_index = &the_index;
314
315         opts.fn = oneway_merge;
316         tree = parse_tree_indirect(current_head->object.sha1);
317         if (!tree)
318                 die(_("failed to unpack HEAD tree object"));
319         parse_tree(tree);
320         init_tree_desc(&t, tree->buffer, tree->size);
321         if (unpack_trees(1, &t, &opts))
322                 exit(128); /* We've already reported the error, finish dying */
323 }
324
325 static void refresh_cache_or_die(int refresh_flags)
326 {
327         /*
328          * refresh_flags contains REFRESH_QUIET, so the only errors
329          * are for unmerged entries.
330          */
331         if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
332                 die_resolve_conflict("commit");
333 }
334
335 static char *prepare_index(int argc, const char **argv, const char *prefix,
336                            const struct commit *current_head, int is_status)
337 {
338         int fd;
339         struct string_list partial;
340         const char **pathspec = NULL;
341         char *old_index_env = NULL;
342         int refresh_flags = REFRESH_QUIET;
343
344         if (is_status)
345                 refresh_flags |= REFRESH_UNMERGED;
346
347         if (*argv)
348                 pathspec = get_pathspec(prefix, argv);
349
350         if (read_cache_preload(pathspec) < 0)
351                 die(_("index file corrupt"));
352
353         if (interactive) {
354                 fd = hold_locked_index(&index_lock, 1);
355
356                 refresh_cache_or_die(refresh_flags);
357
358                 if (write_cache(fd, active_cache, active_nr) ||
359                     close_lock_file(&index_lock))
360                         die(_("unable to create temporary index"));
361
362                 old_index_env = getenv(INDEX_ENVIRONMENT);
363                 setenv(INDEX_ENVIRONMENT, index_lock.filename, 1);
364
365                 if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
366                         die(_("interactive add failed"));
367
368                 if (old_index_env && *old_index_env)
369                         setenv(INDEX_ENVIRONMENT, old_index_env, 1);
370                 else
371                         unsetenv(INDEX_ENVIRONMENT);
372
373                 discard_cache();
374                 read_cache_from(index_lock.filename);
375
376                 commit_style = COMMIT_NORMAL;
377                 return index_lock.filename;
378         }
379
380         /*
381          * Non partial, non as-is commit.
382          *
383          * (1) get the real index;
384          * (2) update the_index as necessary;
385          * (3) write the_index out to the real index (still locked);
386          * (4) return the name of the locked index file.
387          *
388          * The caller should run hooks on the locked real index, and
389          * (A) if all goes well, commit the real index;
390          * (B) on failure, rollback the real index.
391          */
392         if (all || (also && pathspec && *pathspec)) {
393                 fd = hold_locked_index(&index_lock, 1);
394                 add_files_to_cache(also ? prefix : NULL, pathspec, 0);
395                 refresh_cache_or_die(refresh_flags);
396                 if (write_cache(fd, active_cache, active_nr) ||
397                     close_lock_file(&index_lock))
398                         die(_("unable to write new_index file"));
399                 commit_style = COMMIT_NORMAL;
400                 return index_lock.filename;
401         }
402
403         /*
404          * As-is commit.
405          *
406          * (1) return the name of the real index file.
407          *
408          * The caller should run hooks on the real index,
409          * and create commit from the_index.
410          * We still need to refresh the index here.
411          */
412         if (!pathspec || !*pathspec) {
413                 fd = hold_locked_index(&index_lock, 1);
414                 refresh_cache_or_die(refresh_flags);
415                 if (active_cache_changed) {
416                         if (write_cache(fd, active_cache, active_nr) ||
417                             commit_locked_index(&index_lock))
418                                 die(_("unable to write new_index file"));
419                 } else {
420                         rollback_lock_file(&index_lock);
421                 }
422                 commit_style = COMMIT_AS_IS;
423                 return get_index_file();
424         }
425
426         /*
427          * A partial commit.
428          *
429          * (0) find the set of affected paths;
430          * (1) get lock on the real index file;
431          * (2) update the_index with the given paths;
432          * (3) write the_index out to the real index (still locked);
433          * (4) get lock on the false index file;
434          * (5) reset the_index from HEAD;
435          * (6) update the_index the same way as (2);
436          * (7) write the_index out to the false index file;
437          * (8) return the name of the false index file (still locked);
438          *
439          * The caller should run hooks on the locked false index, and
440          * create commit from it.  Then
441          * (A) if all goes well, commit the real index;
442          * (B) on failure, rollback the real index;
443          * In either case, rollback the false index.
444          */
445         commit_style = COMMIT_PARTIAL;
446
447         if (whence != FROM_COMMIT)
448                 die(_("cannot do a partial commit during a %s."), whence_s());
449
450         memset(&partial, 0, sizeof(partial));
451         partial.strdup_strings = 1;
452         if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec))
453                 exit(1);
454
455         discard_cache();
456         if (read_cache() < 0)
457                 die(_("cannot read the index"));
458
459         fd = hold_locked_index(&index_lock, 1);
460         add_remove_files(&partial);
461         refresh_cache(REFRESH_QUIET);
462         if (write_cache(fd, active_cache, active_nr) ||
463             close_lock_file(&index_lock))
464                 die(_("unable to write new_index file"));
465
466         fd = hold_lock_file_for_update(&false_lock,
467                                        git_path("next-index-%"PRIuMAX,
468                                                 (uintmax_t) getpid()),
469                                        LOCK_DIE_ON_ERROR);
470
471         create_base_index(current_head);
472         add_remove_files(&partial);
473         refresh_cache(REFRESH_QUIET);
474
475         if (write_cache(fd, active_cache, active_nr) ||
476             close_lock_file(&false_lock))
477                 die(_("unable to write temporary index file"));
478
479         discard_cache();
480         read_cache_from(false_lock.filename);
481
482         return false_lock.filename;
483 }
484
485 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
486                       struct wt_status *s)
487 {
488         unsigned char sha1[20];
489
490         if (s->relative_paths)
491                 s->prefix = prefix;
492
493         if (amend) {
494                 s->amend = 1;
495                 s->reference = "HEAD^1";
496         }
497         s->verbose = verbose;
498         s->index_file = index_file;
499         s->fp = fp;
500         s->nowarn = nowarn;
501         s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
502
503         wt_status_collect(s);
504
505         switch (status_format) {
506         case STATUS_FORMAT_SHORT:
507                 wt_shortstatus_print(s, null_termination, status_show_branch);
508                 break;
509         case STATUS_FORMAT_PORCELAIN:
510                 wt_porcelain_print(s, null_termination);
511                 break;
512         case STATUS_FORMAT_LONG:
513                 wt_status_print(s);
514                 break;
515         }
516
517         return s->commitable;
518 }
519
520 static int is_a_merge(const struct commit *current_head)
521 {
522         return !!(current_head->parents && current_head->parents->next);
523 }
524
525 static const char sign_off_header[] = "Signed-off-by: ";
526
527 static void determine_author_info(struct strbuf *author_ident)
528 {
529         char *name, *email, *date;
530
531         name = getenv("GIT_AUTHOR_NAME");
532         email = getenv("GIT_AUTHOR_EMAIL");
533         date = getenv("GIT_AUTHOR_DATE");
534
535         if (author_message) {
536                 const char *a, *lb, *rb, *eol;
537
538                 a = strstr(author_message_buffer, "\nauthor ");
539                 if (!a)
540                         die(_("invalid commit: %s"), author_message);
541
542                 lb = strchrnul(a + strlen("\nauthor "), '<');
543                 rb = strchrnul(lb, '>');
544                 eol = strchrnul(rb, '\n');
545                 if (!*lb || !*rb || !*eol)
546                         die(_("invalid commit: %s"), author_message);
547
548                 if (lb == a + strlen("\nauthor "))
549                         /* \nauthor <foo@example.com> */
550                         name = xcalloc(1, 1);
551                 else
552                         name = xmemdupz(a + strlen("\nauthor "),
553                                         (lb - strlen(" ") -
554                                          (a + strlen("\nauthor "))));
555                 email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
556                 date = xmemdupz(rb + strlen("> "), eol - (rb + strlen("> ")));
557         }
558
559         if (force_author) {
560                 const char *lb = strstr(force_author, " <");
561                 const char *rb = strchr(force_author, '>');
562
563                 if (!lb || !rb)
564                         die(_("malformed --author parameter"));
565                 name = xstrndup(force_author, lb - force_author);
566                 email = xstrndup(lb + 2, rb - (lb + 2));
567         }
568
569         if (force_date)
570                 date = force_date;
571         strbuf_addstr(author_ident, fmt_ident(name, email, date,
572                                               IDENT_ERROR_ON_NO_NAME));
573 }
574
575 static int ends_rfc2822_footer(struct strbuf *sb)
576 {
577         int ch;
578         int hit = 0;
579         int i, j, k;
580         int len = sb->len;
581         int first = 1;
582         const char *buf = sb->buf;
583
584         for (i = len - 1; i > 0; i--) {
585                 if (hit && buf[i] == '\n')
586                         break;
587                 hit = (buf[i] == '\n');
588         }
589
590         while (i < len - 1 && buf[i] == '\n')
591                 i++;
592
593         for (; i < len; i = k) {
594                 for (k = i; k < len && buf[k] != '\n'; k++)
595                         ; /* do nothing */
596                 k++;
597
598                 if ((buf[k] == ' ' || buf[k] == '\t') && !first)
599                         continue;
600
601                 first = 0;
602
603                 for (j = 0; i + j < len; j++) {
604                         ch = buf[i + j];
605                         if (ch == ':')
606                                 break;
607                         if (isalnum(ch) ||
608                             (ch == '-'))
609                                 continue;
610                         return 0;
611                 }
612         }
613         return 1;
614 }
615
616 static char *cut_ident_timestamp_part(char *string)
617 {
618         char *ket = strrchr(string, '>');
619         if (!ket || ket[1] != ' ')
620                 die(_("Malformed ident string: '%s'"), string);
621         *++ket = '\0';
622         return ket;
623 }
624
625 static int prepare_to_commit(const char *index_file, const char *prefix,
626                              struct commit *current_head,
627                              struct wt_status *s,
628                              struct strbuf *author_ident)
629 {
630         struct stat statbuf;
631         struct strbuf committer_ident = STRBUF_INIT;
632         int commitable, saved_color_setting;
633         struct strbuf sb = STRBUF_INIT;
634         char *buffer;
635         const char *hook_arg1 = NULL;
636         const char *hook_arg2 = NULL;
637         int ident_shown = 0;
638         int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
639
640         if (!no_verify && run_hook(index_file, "pre-commit", NULL))
641                 return 0;
642
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)
655                                 die(_("could not lookup commit %s"), squash_message);
656                         ctx.output_encoding = get_commit_output_encoding();
657                         format_commit_message(c, "squash! %s\n\n", &sb,
658                                               &ctx);
659                 }
660         }
661
662         if (message.len) {
663                 strbuf_addbuf(&sb, &message);
664                 hook_arg1 = "message";
665         } else if (logfile && !strcmp(logfile, "-")) {
666                 if (isatty(0))
667                         fprintf(stderr, _("(reading log message from standard input)\n"));
668                 if (strbuf_read(&sb, 0, 0) < 0)
669                         die_errno(_("could not read log from standard input"));
670                 hook_arg1 = "message";
671         } else if (logfile) {
672                 if (strbuf_read_file(&sb, logfile, 0) < 0)
673                         die_errno(_("could not read log file '%s'"),
674                                   logfile);
675                 hook_arg1 = "message";
676         } else if (use_message) {
677                 buffer = strstr(use_message_buffer, "\n\n");
678                 if (!buffer || buffer[2] == '\0')
679                         die(_("commit has empty message"));
680                 strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
681                 hook_arg1 = "commit";
682                 hook_arg2 = use_message;
683         } else if (fixup_message) {
684                 struct pretty_print_context ctx = {0};
685                 struct commit *commit;
686                 commit = lookup_commit_reference_by_name(fixup_message);
687                 if (!commit)
688                         die(_("could not lookup commit %s"), fixup_message);
689                 ctx.output_encoding = get_commit_output_encoding();
690                 format_commit_message(commit, "fixup! %s\n\n",
691                                       &sb, &ctx);
692                 hook_arg1 = "message";
693         } else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
694                 if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
695                         die_errno(_("could not read MERGE_MSG"));
696                 hook_arg1 = "merge";
697         } else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
698                 if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
699                         die_errno(_("could not read SQUASH_MSG"));
700                 hook_arg1 = "squash";
701         } else if (template_file) {
702                 if (strbuf_read_file(&sb, template_file, 0) < 0)
703                         die_errno(_("could not read '%s'"), template_file);
704                 hook_arg1 = "template";
705                 clean_message_contents = 0;
706         }
707
708         /*
709          * The remaining cases don't modify the template message, but
710          * just set the argument(s) to the prepare-commit-msg hook.
711          */
712         else if (whence == FROM_MERGE)
713                 hook_arg1 = "merge";
714         else if (whence == FROM_CHERRY_PICK) {
715                 hook_arg1 = "commit";
716                 hook_arg2 = "CHERRY_PICK_HEAD";
717         }
718
719         if (squash_message) {
720                 /*
721                  * If squash_commit was used for the commit subject,
722                  * then we're possibly hijacking other commit log options.
723                  * Reset the hook args to tell the real story.
724                  */
725                 hook_arg1 = "message";
726                 hook_arg2 = "";
727         }
728
729         s->fp = fopen(git_path(commit_editmsg), "w");
730         if (s->fp == NULL)
731                 die_errno(_("could not open '%s'"), git_path(commit_editmsg));
732
733         if (clean_message_contents)
734                 stripspace(&sb, 0);
735
736         if (signoff) {
737                 struct strbuf sob = STRBUF_INIT;
738                 int i;
739
740                 strbuf_addstr(&sob, sign_off_header);
741                 strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
742                                              getenv("GIT_COMMITTER_EMAIL")));
743                 strbuf_addch(&sob, '\n');
744                 for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
745                         ; /* do nothing */
746                 if (prefixcmp(sb.buf + i, sob.buf)) {
747                         if (!i || !ends_rfc2822_footer(&sb))
748                                 strbuf_addch(&sb, '\n');
749                         strbuf_addbuf(&sb, &sob);
750                 }
751                 strbuf_release(&sob);
752         }
753
754         if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
755                 die_errno(_("could not write commit template"));
756
757         strbuf_release(&sb);
758
759         /* This checks and barfs if author is badly specified */
760         determine_author_info(author_ident);
761
762         /* This checks if committer ident is explicitly given */
763         strbuf_addstr(&committer_ident, git_committer_info(0));
764         if (use_editor && include_status) {
765                 char *ai_tmp, *ci_tmp;
766                 if (whence != FROM_COMMIT)
767                         status_printf_ln(s, GIT_COLOR_NORMAL,
768                                 _("\n"
769                                 "It looks like you may be committing a %s.\n"
770                                 "If this is not correct, please remove the file\n"
771                                 "       %s\n"
772                                 "and try again.\n"
773                                 ""),
774                                 whence_s(),
775                                 git_path(whence == FROM_MERGE
776                                          ? "MERGE_HEAD"
777                                          : "CHERRY_PICK_HEAD"));
778
779                 fprintf(s->fp, "\n");
780                 status_printf(s, GIT_COLOR_NORMAL,
781                         _("Please enter the commit message for your changes."));
782                 if (cleanup_mode == CLEANUP_ALL)
783                         status_printf_more(s, GIT_COLOR_NORMAL,
784                                 _(" Lines starting\n"
785                                 "with '#' will be ignored, and an empty"
786                                 " message aborts the commit.\n"));
787                 else /* CLEANUP_SPACE, that is. */
788                         status_printf_more(s, GIT_COLOR_NORMAL,
789                                 _(" Lines starting\n"
790                                 "with '#' will be kept; you may remove them"
791                                 " yourself if you want to.\n"
792                                 "An empty message aborts the commit.\n"));
793                 if (only_include_assumed)
794                         status_printf_ln(s, GIT_COLOR_NORMAL,
795                                         "%s", only_include_assumed);
796
797                 ai_tmp = cut_ident_timestamp_part(author_ident->buf);
798                 ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
799                 if (strcmp(author_ident->buf, committer_ident.buf))
800                         status_printf_ln(s, GIT_COLOR_NORMAL,
801                                 _("%s"
802                                 "Author:    %s"),
803                                 ident_shown++ ? "" : "\n",
804                                 author_ident->buf);
805
806                 if (!user_ident_sufficiently_given())
807                         status_printf_ln(s, GIT_COLOR_NORMAL,
808                                 _("%s"
809                                 "Committer: %s"),
810                                 ident_shown++ ? "" : "\n",
811                                 committer_ident.buf);
812
813                 if (ident_shown)
814                         status_printf_ln(s, GIT_COLOR_NORMAL, "");
815
816                 saved_color_setting = s->use_color;
817                 s->use_color = 0;
818                 commitable = run_status(s->fp, index_file, prefix, 1, s);
819                 s->use_color = saved_color_setting;
820
821                 *ai_tmp = ' ';
822                 *ci_tmp = ' ';
823         } else {
824                 unsigned char sha1[20];
825                 const char *parent = "HEAD";
826
827                 if (!active_nr && read_cache() < 0)
828                         die(_("Cannot read index"));
829
830                 if (amend)
831                         parent = "HEAD^1";
832
833                 if (get_sha1(parent, sha1))
834                         commitable = !!active_nr;
835                 else
836                         commitable = index_differs_from(parent, 0);
837         }
838         strbuf_release(&committer_ident);
839
840         fclose(s->fp);
841
842         /*
843          * Reject an attempt to record a non-merge empty commit without
844          * explicit --allow-empty. In the cherry-pick case, it may be
845          * empty due to conflict resolution, which the user should okay.
846          */
847         if (!commitable && whence != FROM_MERGE && !allow_empty &&
848             !(amend && is_a_merge(current_head))) {
849                 run_status(stdout, index_file, prefix, 0, s);
850                 if (amend)
851                         fputs(_(empty_amend_advice), stderr);
852                 else if (whence == FROM_CHERRY_PICK)
853                         fputs(_(empty_cherry_pick_advice), stderr);
854                 return 0;
855         }
856
857         /*
858          * Re-read the index as pre-commit hook could have updated it,
859          * and write it out as a tree.  We must do this before we invoke
860          * the editor and after we invoke run_status above.
861          */
862         discard_cache();
863         read_cache_from(index_file);
864         if (!active_cache_tree)
865                 active_cache_tree = cache_tree();
866         if (cache_tree_update(active_cache_tree,
867                               active_cache, active_nr, 0, 0) < 0) {
868                 error(_("Error building trees"));
869                 return 0;
870         }
871
872         if (run_hook(index_file, "prepare-commit-msg",
873                      git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
874                 return 0;
875
876         if (use_editor) {
877                 char index[PATH_MAX];
878                 const char *env[2] = { NULL };
879                 env[0] =  index;
880                 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
881                 if (launch_editor(git_path(commit_editmsg), NULL, env)) {
882                         fprintf(stderr,
883                         _("Please supply the message using either -m or -F option.\n"));
884                         exit(1);
885                 }
886         }
887
888         if (!no_verify &&
889             run_hook(index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
890                 return 0;
891         }
892
893         return 1;
894 }
895
896 /*
897  * Find out if the message in the strbuf contains only whitespace and
898  * Signed-off-by lines.
899  */
900 static int message_is_empty(struct strbuf *sb)
901 {
902         struct strbuf tmpl = STRBUF_INIT;
903         const char *nl;
904         int eol, i, start = 0;
905
906         if (cleanup_mode == CLEANUP_NONE && sb->len)
907                 return 0;
908
909         /* See if the template is just a prefix of the message. */
910         if (template_file && strbuf_read_file(&tmpl, template_file, 0) > 0) {
911                 stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
912                 if (start + tmpl.len <= sb->len &&
913                     memcmp(tmpl.buf, sb->buf + start, tmpl.len) == 0)
914                         start += tmpl.len;
915         }
916         strbuf_release(&tmpl);
917
918         /* Check if the rest is just whitespace and Signed-of-by's. */
919         for (i = start; i < sb->len; i++) {
920                 nl = memchr(sb->buf + i, '\n', sb->len - i);
921                 if (nl)
922                         eol = nl - sb->buf;
923                 else
924                         eol = sb->len;
925
926                 if (strlen(sign_off_header) <= eol - i &&
927                     !prefixcmp(sb->buf + i, sign_off_header)) {
928                         i = eol;
929                         continue;
930                 }
931                 while (i < eol)
932                         if (!isspace(sb->buf[i++]))
933                                 return 0;
934         }
935
936         return 1;
937 }
938
939 static const char *find_author_by_nickname(const char *name)
940 {
941         struct rev_info revs;
942         struct commit *commit;
943         struct strbuf buf = STRBUF_INIT;
944         const char *av[20];
945         int ac = 0;
946
947         init_revisions(&revs, NULL);
948         strbuf_addf(&buf, "--author=%s", name);
949         av[++ac] = "--all";
950         av[++ac] = "-i";
951         av[++ac] = buf.buf;
952         av[++ac] = NULL;
953         setup_revisions(ac, av, &revs, NULL);
954         prepare_revision_walk(&revs);
955         commit = get_revision(&revs);
956         if (commit) {
957                 struct pretty_print_context ctx = {0};
958                 ctx.date_mode = DATE_NORMAL;
959                 strbuf_release(&buf);
960                 format_commit_message(commit, "%an <%ae>", &buf, &ctx);
961                 return strbuf_detach(&buf, NULL);
962         }
963         die(_("No existing author found with '%s'"), name);
964 }
965
966
967 static void handle_untracked_files_arg(struct wt_status *s)
968 {
969         if (!untracked_files_arg)
970                 ; /* default already initialized */
971         else if (!strcmp(untracked_files_arg, "no"))
972                 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
973         else if (!strcmp(untracked_files_arg, "normal"))
974                 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
975         else if (!strcmp(untracked_files_arg, "all"))
976                 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
977         else
978                 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
979 }
980
981 static const char *read_commit_message(const char *name)
982 {
983         const char *out_enc, *out;
984         struct commit *commit;
985
986         commit = lookup_commit_reference_by_name(name);
987         if (!commit)
988                 die(_("could not lookup commit %s"), name);
989         out_enc = get_commit_output_encoding();
990         out = logmsg_reencode(commit, out_enc);
991
992         /*
993          * If we failed to reencode the buffer, just copy it
994          * byte for byte so the user can try to fix it up.
995          * This also handles the case where input and output
996          * encodings are identical.
997          */
998         if (out == NULL)
999                 out = xstrdup(commit->buffer);
1000         return out;
1001 }
1002
1003 static int parse_and_validate_options(int argc, const char *argv[],
1004                                       const char * const usage[],
1005                                       const char *prefix,
1006                                       struct commit *current_head,
1007                                       struct wt_status *s)
1008 {
1009         int f = 0;
1010
1011         argc = parse_options(argc, argv, prefix, builtin_commit_options, usage,
1012                              0);
1013
1014         if (force_author && !strchr(force_author, '>'))
1015                 force_author = find_author_by_nickname(force_author);
1016
1017         if (force_author && renew_authorship)
1018                 die(_("Using both --reset-author and --author does not make sense"));
1019
1020         if (logfile || message.len || use_message || fixup_message)
1021                 use_editor = 0;
1022         if (edit_flag)
1023                 use_editor = 1;
1024         if (!use_editor)
1025                 setenv("GIT_EDITOR", ":", 1);
1026
1027         /* Sanity check options */
1028         if (amend && !current_head)
1029                 die(_("You have nothing to amend."));
1030         if (amend && whence != FROM_COMMIT)
1031                 die(_("You are in the middle of a %s -- cannot amend."), whence_s());
1032         if (fixup_message && squash_message)
1033                 die(_("Options --squash and --fixup cannot be used together"));
1034         if (use_message)
1035                 f++;
1036         if (edit_message)
1037                 f++;
1038         if (fixup_message)
1039                 f++;
1040         if (logfile)
1041                 f++;
1042         if (f > 1)
1043                 die(_("Only one of -c/-C/-F/--fixup can be used."));
1044         if (message.len && f > 0)
1045                 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1046         if (edit_message)
1047                 use_message = edit_message;
1048         if (amend && !use_message && !fixup_message)
1049                 use_message = "HEAD";
1050         if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1051                 die(_("--reset-author can be used only with -C, -c or --amend."));
1052         if (use_message) {
1053                 use_message_buffer = read_commit_message(use_message);
1054                 if (!renew_authorship) {
1055                         author_message = use_message;
1056                         author_message_buffer = use_message_buffer;
1057                 }
1058         }
1059         if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1060                 author_message = "CHERRY_PICK_HEAD";
1061                 author_message_buffer = read_commit_message(author_message);
1062         }
1063
1064         if (patch_interactive)
1065                 interactive = 1;
1066
1067         if (!!also + !!only + !!all + !!interactive > 1)
1068                 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
1069         if (argc == 0 && (also || (only && !amend)))
1070                 die(_("No paths with --include/--only does not make sense."));
1071         if (argc == 0 && only && amend)
1072                 only_include_assumed = _("Clever... amending the last one with dirty index.");
1073         if (argc > 0 && !also && !only)
1074                 only_include_assumed = _("Explicit paths specified without -i nor -o; assuming --only paths...");
1075         if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1076                 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1077         else if (!strcmp(cleanup_arg, "verbatim"))
1078                 cleanup_mode = CLEANUP_NONE;
1079         else if (!strcmp(cleanup_arg, "whitespace"))
1080                 cleanup_mode = CLEANUP_SPACE;
1081         else if (!strcmp(cleanup_arg, "strip"))
1082                 cleanup_mode = CLEANUP_ALL;
1083         else
1084                 die(_("Invalid cleanup mode %s"), cleanup_arg);
1085
1086         handle_untracked_files_arg(s);
1087
1088         if (all && argc > 0)
1089                 die(_("Paths with -a does not make sense."));
1090
1091         if (null_termination && status_format == STATUS_FORMAT_LONG)
1092                 status_format = STATUS_FORMAT_PORCELAIN;
1093         if (status_format != STATUS_FORMAT_LONG)
1094                 dry_run = 1;
1095
1096         return argc;
1097 }
1098
1099 static int dry_run_commit(int argc, const char **argv, const char *prefix,
1100                           const struct commit *current_head, struct wt_status *s)
1101 {
1102         int commitable;
1103         const char *index_file;
1104
1105         index_file = prepare_index(argc, argv, prefix, current_head, 1);
1106         commitable = run_status(stdout, index_file, prefix, 0, s);
1107         rollback_index_files();
1108
1109         return commitable ? 0 : 1;
1110 }
1111
1112 static int parse_status_slot(const char *var, int offset)
1113 {
1114         if (!strcasecmp(var+offset, "header"))
1115                 return WT_STATUS_HEADER;
1116         if (!strcasecmp(var+offset, "branch"))
1117                 return WT_STATUS_ONBRANCH;
1118         if (!strcasecmp(var+offset, "updated")
1119                 || !strcasecmp(var+offset, "added"))
1120                 return WT_STATUS_UPDATED;
1121         if (!strcasecmp(var+offset, "changed"))
1122                 return WT_STATUS_CHANGED;
1123         if (!strcasecmp(var+offset, "untracked"))
1124                 return WT_STATUS_UNTRACKED;
1125         if (!strcasecmp(var+offset, "nobranch"))
1126                 return WT_STATUS_NOBRANCH;
1127         if (!strcasecmp(var+offset, "unmerged"))
1128                 return WT_STATUS_UNMERGED;
1129         return -1;
1130 }
1131
1132 static int git_status_config(const char *k, const char *v, void *cb)
1133 {
1134         struct wt_status *s = cb;
1135
1136         if (!strcmp(k, "status.submodulesummary")) {
1137                 int is_bool;
1138                 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1139                 if (is_bool && s->submodule_summary)
1140                         s->submodule_summary = -1;
1141                 return 0;
1142         }
1143         if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1144                 s->use_color = git_config_colorbool(k, v, -1);
1145                 return 0;
1146         }
1147         if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
1148                 int slot = parse_status_slot(k, 13);
1149                 if (slot < 0)
1150                         return 0;
1151                 if (!v)
1152                         return config_error_nonbool(k);
1153                 color_parse(v, k, s->color_palette[slot]);
1154                 return 0;
1155         }
1156         if (!strcmp(k, "status.relativepaths")) {
1157                 s->relative_paths = git_config_bool(k, v);
1158                 return 0;
1159         }
1160         if (!strcmp(k, "status.showuntrackedfiles")) {
1161                 if (!v)
1162                         return config_error_nonbool(k);
1163                 else if (!strcmp(v, "no"))
1164                         s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1165                 else if (!strcmp(v, "normal"))
1166                         s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1167                 else if (!strcmp(v, "all"))
1168                         s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1169                 else
1170                         return error(_("Invalid untracked files mode '%s'"), v);
1171                 return 0;
1172         }
1173         return git_diff_ui_config(k, v, NULL);
1174 }
1175
1176 int cmd_status(int argc, const char **argv, const char *prefix)
1177 {
1178         struct wt_status s;
1179         int fd;
1180         unsigned char sha1[20];
1181         static struct option builtin_status_options[] = {
1182                 OPT__VERBOSE(&verbose, "be verbose"),
1183                 OPT_SET_INT('s', "short", &status_format,
1184                             "show status concisely", STATUS_FORMAT_SHORT),
1185                 OPT_BOOLEAN('b', "branch", &status_show_branch,
1186                             "show branch information"),
1187                 OPT_SET_INT(0, "porcelain", &status_format,
1188                             "machine-readable output",
1189                             STATUS_FORMAT_PORCELAIN),
1190                 OPT_BOOLEAN('z', "null", &null_termination,
1191                             "terminate entries with NUL"),
1192                 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1193                   "mode",
1194                   "show untracked files, optional modes: all, normal, no. (Default: all)",
1195                   PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1196                 OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
1197                             "show ignored files"),
1198                 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when",
1199                   "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)",
1200                   PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1201                 OPT_END(),
1202         };
1203
1204         if (argc == 2 && !strcmp(argv[1], "-h"))
1205                 usage_with_options(builtin_status_usage, builtin_status_options);
1206
1207         wt_status_prepare(&s);
1208         gitmodules_config();
1209         git_config(git_status_config, &s);
1210         determine_whence(&s);
1211         argc = parse_options(argc, argv, prefix,
1212                              builtin_status_options,
1213                              builtin_status_usage, 0);
1214
1215         if (null_termination && status_format == STATUS_FORMAT_LONG)
1216                 status_format = STATUS_FORMAT_PORCELAIN;
1217
1218         handle_untracked_files_arg(&s);
1219         if (show_ignored_in_status)
1220                 s.show_ignored_files = 1;
1221         if (*argv)
1222                 s.pathspec = get_pathspec(prefix, argv);
1223
1224         read_cache_preload(s.pathspec);
1225         refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);
1226
1227         fd = hold_locked_index(&index_lock, 0);
1228         if (0 <= fd)
1229                 update_index_if_able(&the_index, &index_lock);
1230
1231         s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1232         s.ignore_submodule_arg = ignore_submodule_arg;
1233         wt_status_collect(&s);
1234
1235         if (s.relative_paths)
1236                 s.prefix = prefix;
1237         if (s.use_color == -1)
1238                 s.use_color = git_use_color_default;
1239         if (diff_use_color_default == -1)
1240                 diff_use_color_default = git_use_color_default;
1241
1242         switch (status_format) {
1243         case STATUS_FORMAT_SHORT:
1244                 wt_shortstatus_print(&s, null_termination, status_show_branch);
1245                 break;
1246         case STATUS_FORMAT_PORCELAIN:
1247                 wt_porcelain_print(&s, null_termination);
1248                 break;
1249         case STATUS_FORMAT_LONG:
1250                 s.verbose = verbose;
1251                 s.ignore_submodule_arg = ignore_submodule_arg;
1252                 wt_status_print(&s);
1253                 break;
1254         }
1255         return 0;
1256 }
1257
1258 static void print_summary(const char *prefix, const unsigned char *sha1,
1259                           int initial_commit)
1260 {
1261         struct rev_info rev;
1262         struct commit *commit;
1263         struct strbuf format = STRBUF_INIT;
1264         unsigned char junk_sha1[20];
1265         const char *head = resolve_ref("HEAD", junk_sha1, 0, NULL);
1266         struct pretty_print_context pctx = {0};
1267         struct strbuf author_ident = STRBUF_INIT;
1268         struct strbuf committer_ident = STRBUF_INIT;
1269
1270         commit = lookup_commit(sha1);
1271         if (!commit)
1272                 die(_("couldn't look up newly created commit"));
1273         if (!commit || parse_commit(commit))
1274                 die(_("could not parse newly created commit"));
1275
1276         strbuf_addstr(&format, "format:%h] %s");
1277
1278         format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1279         format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1280         if (strbuf_cmp(&author_ident, &committer_ident)) {
1281                 strbuf_addstr(&format, "\n Author: ");
1282                 strbuf_addbuf_percentquote(&format, &author_ident);
1283         }
1284         if (!user_ident_sufficiently_given()) {
1285                 strbuf_addstr(&format, "\n Committer: ");
1286                 strbuf_addbuf_percentquote(&format, &committer_ident);
1287                 if (advice_implicit_identity) {
1288                         strbuf_addch(&format, '\n');
1289                         strbuf_addstr(&format, _(implicit_ident_advice));
1290                 }
1291         }
1292         strbuf_release(&author_ident);
1293         strbuf_release(&committer_ident);
1294
1295         init_revisions(&rev, prefix);
1296         setup_revisions(0, NULL, &rev, NULL);
1297
1298         rev.diff = 1;
1299         rev.diffopt.output_format =
1300                 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1301
1302         rev.verbose_header = 1;
1303         rev.show_root_diff = 1;
1304         get_commit_format(format.buf, &rev);
1305         rev.always_show_header = 0;
1306         rev.diffopt.detect_rename = 1;
1307         rev.diffopt.break_opt = 0;
1308         diff_setup_done(&rev.diffopt);
1309
1310         printf("[%s%s ",
1311                 !prefixcmp(head, "refs/heads/") ?
1312                         head + 11 :
1313                         !strcmp(head, "HEAD") ?
1314                                 _("detached HEAD") :
1315                                 head,
1316                 initial_commit ? _(" (root-commit)") : "");
1317
1318         if (!log_tree_commit(&rev, commit)) {
1319                 rev.always_show_header = 1;
1320                 rev.use_terminator = 1;
1321                 log_tree_commit(&rev, commit);
1322         }
1323
1324         strbuf_release(&format);
1325 }
1326
1327 static int git_commit_config(const char *k, const char *v, void *cb)
1328 {
1329         struct wt_status *s = cb;
1330
1331         if (!strcmp(k, "commit.template"))
1332                 return git_config_pathname(&template_file, k, v);
1333         if (!strcmp(k, "commit.status")) {
1334                 include_status = git_config_bool(k, v);
1335                 return 0;
1336         }
1337
1338         return git_status_config(k, v, s);
1339 }
1340
1341 static const char post_rewrite_hook[] = "hooks/post-rewrite";
1342
1343 static int run_rewrite_hook(const unsigned char *oldsha1,
1344                             const unsigned char *newsha1)
1345 {
1346         /* oldsha1 SP newsha1 LF NUL */
1347         static char buf[2*40 + 3];
1348         struct child_process proc;
1349         const char *argv[3];
1350         int code;
1351         size_t n;
1352
1353         if (access(git_path(post_rewrite_hook), X_OK) < 0)
1354                 return 0;
1355
1356         argv[0] = git_path(post_rewrite_hook);
1357         argv[1] = "amend";
1358         argv[2] = NULL;
1359
1360         memset(&proc, 0, sizeof(proc));
1361         proc.argv = argv;
1362         proc.in = -1;
1363         proc.stdout_to_stderr = 1;
1364
1365         code = start_command(&proc);
1366         if (code)
1367                 return code;
1368         n = snprintf(buf, sizeof(buf), "%s %s\n",
1369                      sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
1370         write_in_full(proc.in, buf, n);
1371         close(proc.in);
1372         return finish_command(&proc);
1373 }
1374
1375 int cmd_commit(int argc, const char **argv, const char *prefix)
1376 {
1377         struct strbuf sb = STRBUF_INIT;
1378         struct strbuf author_ident = STRBUF_INIT;
1379         const char *index_file, *reflog_msg;
1380         char *nl, *p;
1381         unsigned char sha1[20];
1382         struct ref_lock *ref_lock;
1383         struct commit_list *parents = NULL, **pptr = &parents;
1384         struct stat statbuf;
1385         int allow_fast_forward = 1;
1386         struct wt_status s;
1387         struct commit *current_head = NULL;
1388
1389         if (argc == 2 && !strcmp(argv[1], "-h"))
1390                 usage_with_options(builtin_commit_usage, builtin_commit_options);
1391
1392         wt_status_prepare(&s);
1393         git_config(git_commit_config, &s);
1394         determine_whence(&s);
1395
1396         if (s.use_color == -1)
1397                 s.use_color = git_use_color_default;
1398         if (get_sha1("HEAD", sha1))
1399                 current_head = NULL;
1400         else {
1401                 current_head = lookup_commit(sha1);
1402                 if (!current_head || parse_commit(current_head))
1403                         die(_("could not parse HEAD commit"));
1404         }
1405         argc = parse_and_validate_options(argc, argv, builtin_commit_usage,
1406                                           prefix, current_head, &s);
1407         if (dry_run) {
1408                 if (diff_use_color_default == -1)
1409                         diff_use_color_default = git_use_color_default;
1410                 return dry_run_commit(argc, argv, prefix, current_head, &s);
1411         }
1412         index_file = prepare_index(argc, argv, prefix, current_head, 0);
1413
1414         /* Set up everything for writing the commit object.  This includes
1415            running hooks, writing the trees, and interacting with the user.  */
1416         if (!prepare_to_commit(index_file, prefix,
1417                                current_head, &s, &author_ident)) {
1418                 rollback_index_files();
1419                 return 1;
1420         }
1421
1422         /* Determine parents */
1423         reflog_msg = getenv("GIT_REFLOG_ACTION");
1424         if (!current_head) {
1425                 if (!reflog_msg)
1426                         reflog_msg = "commit (initial)";
1427         } else if (amend) {
1428                 struct commit_list *c;
1429
1430                 if (!reflog_msg)
1431                         reflog_msg = "commit (amend)";
1432                 for (c = current_head->parents; c; c = c->next)
1433                         pptr = &commit_list_insert(c->item, pptr)->next;
1434         } else if (whence == FROM_MERGE) {
1435                 struct strbuf m = STRBUF_INIT;
1436                 FILE *fp;
1437
1438                 if (!reflog_msg)
1439                         reflog_msg = "commit (merge)";
1440                 pptr = &commit_list_insert(current_head, pptr)->next;
1441                 fp = fopen(git_path("MERGE_HEAD"), "r");
1442                 if (fp == NULL)
1443                         die_errno(_("could not open '%s' for reading"),
1444                                   git_path("MERGE_HEAD"));
1445                 while (strbuf_getline(&m, fp, '\n') != EOF) {
1446                         unsigned char sha1[20];
1447                         if (get_sha1_hex(m.buf, sha1) < 0)
1448                                 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1449                         pptr = &commit_list_insert(lookup_commit(sha1), pptr)->next;
1450                 }
1451                 fclose(fp);
1452                 strbuf_release(&m);
1453                 if (!stat(git_path("MERGE_MODE"), &statbuf)) {
1454                         if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1455                                 die_errno(_("could not read MERGE_MODE"));
1456                         if (!strcmp(sb.buf, "no-ff"))
1457                                 allow_fast_forward = 0;
1458                 }
1459                 if (allow_fast_forward)
1460                         parents = reduce_heads(parents);
1461         } else {
1462                 if (!reflog_msg)
1463                         reflog_msg = (whence == FROM_CHERRY_PICK)
1464                                         ? "commit (cherry-pick)"
1465                                         : "commit";
1466                 pptr = &commit_list_insert(current_head, pptr)->next;
1467         }
1468
1469         /* Finally, get the commit message */
1470         strbuf_reset(&sb);
1471         if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1472                 int saved_errno = errno;
1473                 rollback_index_files();
1474                 die(_("could not read commit message: %s"), strerror(saved_errno));
1475         }
1476
1477         /* Truncate the message just before the diff, if any. */
1478         if (verbose) {
1479                 p = strstr(sb.buf, "\ndiff --git ");
1480                 if (p != NULL)
1481                         strbuf_setlen(&sb, p - sb.buf + 1);
1482         }
1483
1484         if (cleanup_mode != CLEANUP_NONE)
1485                 stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1486         if (message_is_empty(&sb) && !allow_empty_message) {
1487                 rollback_index_files();
1488                 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
1489                 exit(1);
1490         }
1491
1492         if (commit_tree(sb.buf, active_cache_tree->sha1, parents, sha1,
1493                         author_ident.buf)) {
1494                 rollback_index_files();
1495                 die(_("failed to write commit object"));
1496         }
1497         strbuf_release(&author_ident);
1498
1499         ref_lock = lock_any_ref_for_update("HEAD",
1500                                            !current_head
1501                                            ? NULL
1502                                            : current_head->object.sha1,
1503                                            0);
1504
1505         nl = strchr(sb.buf, '\n');
1506         if (nl)
1507                 strbuf_setlen(&sb, nl + 1 - sb.buf);
1508         else
1509                 strbuf_addch(&sb, '\n');
1510         strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1511         strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1512
1513         if (!ref_lock) {
1514                 rollback_index_files();
1515                 die(_("cannot lock HEAD ref"));
1516         }
1517         if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1518                 rollback_index_files();
1519                 die(_("cannot update HEAD ref"));
1520         }
1521
1522         unlink(git_path("CHERRY_PICK_HEAD"));
1523         unlink(git_path("MERGE_HEAD"));
1524         unlink(git_path("MERGE_MSG"));
1525         unlink(git_path("MERGE_MODE"));
1526         unlink(git_path("SQUASH_MSG"));
1527
1528         if (commit_index_files())
1529                 die (_("Repository has been updated, but unable to write\n"
1530                      "new_index file. Check that disk is not full or quota is\n"
1531                      "not exceeded, and then \"git reset HEAD\" to recover."));
1532
1533         rerere(0);
1534         run_hook(get_index_file(), "post-commit", NULL);
1535         if (amend && !no_post_rewrite) {
1536                 struct notes_rewrite_cfg *cfg;
1537                 cfg = init_copy_notes_for_rewrite("amend");
1538                 if (cfg) {
1539                         /* we are amending, so current_head is not NULL */
1540                         copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1541                         finish_copy_notes_for_rewrite(cfg);
1542                 }
1543                 run_rewrite_hook(current_head->object.sha1, sha1);
1544         }
1545         if (!quiet)
1546                 print_summary(prefix, sha1, !current_head);
1547
1548         return 0;
1549 }