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