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