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