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