4 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
5 * Based on git-commit.sh by Junio C Hamano and Linus Torvalds
9 #include "cache-tree.h"
17 #include "wt-status.h"
18 #include "run-command.h"
23 #include "parse-options.h"
24 #include "string-list.h"
26 #include "unpack-trees.h"
28 #include "submodule.h"
29 #include "gpg-interface.h"
31 #include "sequencer.h"
32 #include "notes-utils.h"
35 static const char * const builtin_commit_usage[] = {
36 N_("git commit [options] [--] <pathspec>..."),
40 static const char * const builtin_status_usage[] = {
41 N_("git status [options] [--] <pathspec>..."),
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"
50 " git config --global user.name \"Your Name\"\n"
51 " git config --global user.email you@example.com\n"
53 "After doing this, you may fix the identity used for this commit with:\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"
66 " git commit --allow-empty\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"
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 */
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.
119 static const char *cleanup_arg;
121 static enum commit_whence whence;
122 static int sequencer_in_use;
123 static int use_editor = 1, include_status = 1;
124 static int show_ignored_in_status, have_option_m;
125 static const char *only_include_assumed;
126 static struct strbuf message = STRBUF_INIT;
128 static enum status_format {
129 STATUS_FORMAT_NONE = 0,
132 STATUS_FORMAT_PORCELAIN,
134 STATUS_FORMAT_UNSPECIFIED
135 } status_format = STATUS_FORMAT_UNSPECIFIED;
137 static int opt_parse_m(const struct option *opt, const char *arg, int unset)
139 struct strbuf *buf = opt->value;
142 strbuf_setlen(buf, 0);
146 strbuf_addch(buf, '\n');
147 strbuf_addstr(buf, arg);
148 strbuf_complete_line(buf);
153 static void determine_whence(struct wt_status *s)
155 if (file_exists(git_path("MERGE_HEAD")))
157 else if (file_exists(git_path("CHERRY_PICK_HEAD"))) {
158 whence = FROM_CHERRY_PICK;
159 if (file_exists(git_path("sequencer")))
160 sequencer_in_use = 1;
163 whence = FROM_COMMIT;
168 static void status_init_config(struct wt_status *s, config_fn_t fn)
170 wt_status_prepare(s);
174 s->hints = advice_status_hints; /* must come after git_config() */
177 static void rollback_index_files(void)
179 switch (commit_style) {
181 break; /* nothing to do */
183 rollback_lock_file(&index_lock);
186 rollback_lock_file(&index_lock);
187 rollback_lock_file(&false_lock);
192 static int commit_index_files(void)
196 switch (commit_style) {
198 break; /* nothing to do */
200 err = commit_lock_file(&index_lock);
203 err = commit_lock_file(&index_lock);
204 rollback_lock_file(&false_lock);
212 * Take a union of paths in the index and the named tree (typically, "HEAD"),
213 * and return the paths that match the given pattern in list.
215 static int list_paths(struct string_list *list, const char *with_tree,
216 const char *prefix, const struct pathspec *pattern)
224 m = xcalloc(1, pattern->nr);
227 char *max_prefix = common_prefix(pattern);
228 overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
232 for (i = 0; i < active_nr; i++) {
233 const struct cache_entry *ce = active_cache[i];
234 struct string_list_item *item;
236 if (ce->ce_flags & CE_UPDATE)
238 if (!ce_path_match(ce, pattern, m))
240 item = string_list_insert(list, ce->name);
241 if (ce_skip_worktree(ce))
242 item->util = item; /* better a valid pointer than a fake one */
245 return report_path_error(m, pattern, prefix);
248 static void add_remove_files(struct string_list *list)
251 for (i = 0; i < list->nr; i++) {
253 struct string_list_item *p = &(list->items[i]);
255 /* p->util is skip-worktree */
259 if (!lstat(p->string, &st)) {
260 if (add_to_cache(p->string, &st, 0))
261 die(_("updating files failed"));
263 remove_file_from_cache(p->string);
267 static void create_base_index(const struct commit *current_head)
270 struct unpack_trees_options opts;
278 memset(&opts, 0, sizeof(opts));
282 opts.src_index = &the_index;
283 opts.dst_index = &the_index;
285 opts.fn = oneway_merge;
286 tree = parse_tree_indirect(current_head->object.sha1);
288 die(_("failed to unpack HEAD tree object"));
290 init_tree_desc(&t, tree->buffer, tree->size);
291 if (unpack_trees(1, &t, &opts))
292 exit(128); /* We've already reported the error, finish dying */
295 static void refresh_cache_or_die(int refresh_flags)
298 * refresh_flags contains REFRESH_QUIET, so the only errors
299 * are for unmerged entries.
301 if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
302 die_resolve_conflict("commit");
305 static char *prepare_index(int argc, const char **argv, const char *prefix,
306 const struct commit *current_head, int is_status)
309 struct string_list partial;
310 struct pathspec pathspec;
311 int refresh_flags = REFRESH_QUIET;
314 refresh_flags |= REFRESH_UNMERGED;
315 parse_pathspec(&pathspec, 0,
316 PATHSPEC_PREFER_FULL,
319 if (read_cache_preload(&pathspec) < 0)
320 die(_("index file corrupt"));
323 char *old_index_env = NULL;
324 fd = hold_locked_index(&index_lock, 1);
326 refresh_cache_or_die(refresh_flags);
328 if (write_cache(fd, active_cache, active_nr) ||
329 close_lock_file(&index_lock))
330 die(_("unable to create temporary index"));
332 old_index_env = getenv(INDEX_ENVIRONMENT);
333 setenv(INDEX_ENVIRONMENT, index_lock.filename, 1);
335 if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
336 die(_("interactive add failed"));
338 if (old_index_env && *old_index_env)
339 setenv(INDEX_ENVIRONMENT, old_index_env, 1);
341 unsetenv(INDEX_ENVIRONMENT);
344 read_cache_from(index_lock.filename);
346 commit_style = COMMIT_NORMAL;
347 return index_lock.filename;
351 * Non partial, non as-is commit.
353 * (1) get the real index;
354 * (2) update the_index as necessary;
355 * (3) write the_index out to the real index (still locked);
356 * (4) return the name of the locked index file.
358 * The caller should run hooks on the locked real index, and
359 * (A) if all goes well, commit the real index;
360 * (B) on failure, rollback the real index.
362 if (all || (also && pathspec.nr)) {
363 fd = hold_locked_index(&index_lock, 1);
364 add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
365 refresh_cache_or_die(refresh_flags);
366 update_main_cache_tree(WRITE_TREE_SILENT);
367 if (write_cache(fd, active_cache, active_nr) ||
368 close_lock_file(&index_lock))
369 die(_("unable to write new_index file"));
370 commit_style = COMMIT_NORMAL;
371 return index_lock.filename;
377 * (1) return the name of the real index file.
379 * The caller should run hooks on the real index,
380 * and create commit from the_index.
381 * We still need to refresh the index here.
383 if (!only && !pathspec.nr) {
384 fd = hold_locked_index(&index_lock, 1);
385 refresh_cache_or_die(refresh_flags);
386 if (active_cache_changed) {
387 update_main_cache_tree(WRITE_TREE_SILENT);
388 if (write_cache(fd, active_cache, active_nr) ||
389 commit_locked_index(&index_lock))
390 die(_("unable to write new_index file"));
392 rollback_lock_file(&index_lock);
394 commit_style = COMMIT_AS_IS;
395 return get_index_file();
401 * (0) find the set of affected paths;
402 * (1) get lock on the real index file;
403 * (2) update the_index with the given paths;
404 * (3) write the_index out to the real index (still locked);
405 * (4) get lock on the false index file;
406 * (5) reset the_index from HEAD;
407 * (6) update the_index the same way as (2);
408 * (7) write the_index out to the false index file;
409 * (8) return the name of the false index file (still locked);
411 * The caller should run hooks on the locked false index, and
412 * create commit from it. Then
413 * (A) if all goes well, commit the real index;
414 * (B) on failure, rollback the real index;
415 * In either case, rollback the false index.
417 commit_style = COMMIT_PARTIAL;
419 if (whence != FROM_COMMIT) {
420 if (whence == FROM_MERGE)
421 die(_("cannot do a partial commit during a merge."));
422 else if (whence == FROM_CHERRY_PICK)
423 die(_("cannot do a partial commit during a cherry-pick."));
426 memset(&partial, 0, sizeof(partial));
427 partial.strdup_strings = 1;
428 if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
432 if (read_cache() < 0)
433 die(_("cannot read the index"));
435 fd = hold_locked_index(&index_lock, 1);
436 add_remove_files(&partial);
437 refresh_cache(REFRESH_QUIET);
438 if (write_cache(fd, active_cache, active_nr) ||
439 close_lock_file(&index_lock))
440 die(_("unable to write new_index file"));
442 fd = hold_lock_file_for_update(&false_lock,
443 git_path("next-index-%"PRIuMAX,
444 (uintmax_t) getpid()),
447 create_base_index(current_head);
448 add_remove_files(&partial);
449 refresh_cache(REFRESH_QUIET);
451 if (write_cache(fd, active_cache, active_nr) ||
452 close_lock_file(&false_lock))
453 die(_("unable to write temporary index file"));
456 read_cache_from(false_lock.filename);
458 return false_lock.filename;
461 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
464 unsigned char sha1[20];
466 if (s->relative_paths)
471 s->reference = "HEAD^1";
473 s->verbose = verbose;
474 s->index_file = index_file;
477 s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
479 wt_status_collect(s);
481 switch (status_format) {
482 case STATUS_FORMAT_SHORT:
483 wt_shortstatus_print(s);
485 case STATUS_FORMAT_PORCELAIN:
486 wt_porcelain_print(s);
488 case STATUS_FORMAT_UNSPECIFIED:
489 die("BUG: finalize_deferred_config() should have been called");
491 case STATUS_FORMAT_NONE:
492 case STATUS_FORMAT_LONG:
497 return s->commitable;
500 static int is_a_merge(const struct commit *current_head)
502 return !!(current_head->parents && current_head->parents->next);
505 static void export_one(const char *var, const char *s, const char *e, int hack)
507 struct strbuf buf = STRBUF_INIT;
509 strbuf_addch(&buf, hack);
510 strbuf_addf(&buf, "%.*s", (int)(e - s), s);
511 setenv(var, buf.buf, 1);
512 strbuf_release(&buf);
515 static int sane_ident_split(struct ident_split *person)
517 if (!person->name_begin || !person->name_end ||
518 person->name_begin == person->name_end)
519 return 0; /* no human readable name */
520 if (!person->mail_begin || !person->mail_end ||
521 person->mail_begin == person->mail_end)
522 return 0; /* no usable mail */
523 if (!person->date_begin || !person->date_end ||
524 !person->tz_begin || !person->tz_end)
529 static void determine_author_info(struct strbuf *author_ident)
531 char *name, *email, *date;
532 struct ident_split author;
534 name = getenv("GIT_AUTHOR_NAME");
535 email = getenv("GIT_AUTHOR_EMAIL");
536 date = getenv("GIT_AUTHOR_DATE");
538 if (author_message) {
539 const char *a, *lb, *rb, *eol;
542 a = strstr(author_message_buffer, "\nauthor ");
544 die(_("invalid commit: %s"), author_message);
546 lb = strchrnul(a + strlen("\nauthor "), '<');
547 rb = strchrnul(lb, '>');
548 eol = strchrnul(rb, '\n');
549 if (!*lb || !*rb || !*eol)
550 die(_("invalid commit: %s"), author_message);
552 if (lb == a + strlen("\nauthor "))
553 /* \nauthor <foo@example.com> */
554 name = xcalloc(1, 1);
556 name = xmemdupz(a + strlen("\nauthor "),
558 (a + strlen("\nauthor "))));
559 email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
560 len = eol - (rb + strlen("> "));
561 date = xmalloc(len + 2);
563 memcpy(date + 1, rb + strlen("> "), len);
564 date[len + 1] = '\0';
568 const char *lb = strstr(force_author, " <");
569 const char *rb = strchr(force_author, '>');
572 die(_("malformed --author parameter"));
573 name = xstrndup(force_author, lb - force_author);
574 email = xstrndup(lb + 2, rb - (lb + 2));
579 strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
580 if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
581 sane_ident_split(&author)) {
582 export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
583 export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
584 export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
588 static void split_ident_or_die(struct ident_split *id, const struct strbuf *buf)
590 if (split_ident_line(id, buf->buf, buf->len) ||
591 !sane_ident_split(id))
592 die(_("Malformed ident string: '%s'"), buf->buf);
595 static int author_date_is_interesting(void)
597 return author_message || force_date;
600 static int prepare_to_commit(const char *index_file, const char *prefix,
601 struct commit *current_head,
603 struct strbuf *author_ident)
606 struct strbuf committer_ident = STRBUF_INIT;
608 struct strbuf sb = STRBUF_INIT;
609 const char *hook_arg1 = NULL;
610 const char *hook_arg2 = NULL;
611 int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
612 int old_display_comment_prefix;
614 /* This checks and barfs if author is badly specified */
615 determine_author_info(author_ident);
617 if (!no_verify && run_commit_hook(use_editor, index_file, "pre-commit", NULL))
620 if (squash_message) {
622 * Insert the proper subject line before other commit
623 * message options add their content.
625 if (use_message && !strcmp(use_message, squash_message))
626 strbuf_addstr(&sb, "squash! ");
628 struct pretty_print_context ctx = {0};
630 c = lookup_commit_reference_by_name(squash_message);
632 die(_("could not lookup commit %s"), squash_message);
633 ctx.output_encoding = get_commit_output_encoding();
634 format_commit_message(c, "squash! %s\n\n", &sb,
640 strbuf_addbuf(&sb, &message);
641 hook_arg1 = "message";
642 } else if (logfile && !strcmp(logfile, "-")) {
644 fprintf(stderr, _("(reading log message from standard input)\n"));
645 if (strbuf_read(&sb, 0, 0) < 0)
646 die_errno(_("could not read log from standard input"));
647 hook_arg1 = "message";
648 } else if (logfile) {
649 if (strbuf_read_file(&sb, logfile, 0) < 0)
650 die_errno(_("could not read log file '%s'"),
652 hook_arg1 = "message";
653 } else if (use_message) {
655 buffer = strstr(use_message_buffer, "\n\n");
656 if (!use_editor && (!buffer || buffer[2] == '\0'))
657 die(_("commit has empty message"));
658 strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
659 hook_arg1 = "commit";
660 hook_arg2 = use_message;
661 } else if (fixup_message) {
662 struct pretty_print_context ctx = {0};
663 struct commit *commit;
664 commit = lookup_commit_reference_by_name(fixup_message);
666 die(_("could not lookup commit %s"), fixup_message);
667 ctx.output_encoding = get_commit_output_encoding();
668 format_commit_message(commit, "fixup! %s\n\n",
670 hook_arg1 = "message";
671 } else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
672 if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
673 die_errno(_("could not read MERGE_MSG"));
675 } else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
676 if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
677 die_errno(_("could not read SQUASH_MSG"));
678 hook_arg1 = "squash";
679 } else if (template_file) {
680 if (strbuf_read_file(&sb, template_file, 0) < 0)
681 die_errno(_("could not read '%s'"), template_file);
682 hook_arg1 = "template";
683 clean_message_contents = 0;
687 * The remaining cases don't modify the template message, but
688 * just set the argument(s) to the prepare-commit-msg hook.
690 else if (whence == FROM_MERGE)
692 else if (whence == FROM_CHERRY_PICK) {
693 hook_arg1 = "commit";
694 hook_arg2 = "CHERRY_PICK_HEAD";
697 if (squash_message) {
699 * If squash_commit was used for the commit subject,
700 * then we're possibly hijacking other commit log options.
701 * Reset the hook args to tell the real story.
703 hook_arg1 = "message";
707 s->fp = fopen(git_path(commit_editmsg), "w");
709 die_errno(_("could not open '%s'"), git_path(commit_editmsg));
711 /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
712 old_display_comment_prefix = s->display_comment_prefix;
713 s->display_comment_prefix = 1;
716 * Most hints are counter-productive when the commit has
721 if (clean_message_contents)
726 * See if we have a Conflicts: block at the end. If yes, count
727 * its size, so we can ignore it.
729 int ignore_footer = 0;
730 int i, eol, previous = 0;
733 for (i = 0; i < sb.len; i++) {
734 nl = memchr(sb.buf + i, '\n', sb.len - i);
739 if (starts_with(sb.buf + previous, "\nConflicts:\n")) {
740 ignore_footer = sb.len - previous;
748 append_signoff(&sb, ignore_footer, 0);
751 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
752 die_errno(_("could not write commit template"));
756 /* This checks if committer ident is explicitly given */
757 strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
758 if (use_editor && include_status) {
760 int saved_color_setting;
761 struct ident_split ci, ai;
763 if (whence != FROM_COMMIT) {
764 if (cleanup_mode == CLEANUP_SCISSORS)
765 wt_status_add_cut_line(s->fp);
766 status_printf_ln(s, GIT_COLOR_NORMAL,
769 "It looks like you may be committing a merge.\n"
770 "If this is not correct, please remove the file\n"
774 "It looks like you may be committing a cherry-pick.\n"
775 "If this is not correct, please remove the file\n"
778 git_path(whence == FROM_MERGE
780 : "CHERRY_PICK_HEAD"));
783 fprintf(s->fp, "\n");
784 if (cleanup_mode == CLEANUP_ALL)
785 status_printf(s, GIT_COLOR_NORMAL,
786 _("Please enter the commit message for your changes."
787 " Lines starting\nwith '%c' will be ignored, and an empty"
788 " message aborts the commit.\n"), comment_line_char);
789 else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
790 wt_status_add_cut_line(s->fp);
791 else /* CLEANUP_SPACE, that is. */
792 status_printf(s, GIT_COLOR_NORMAL,
793 _("Please enter the commit message for your changes."
795 "with '%c' will be kept; you may remove them"
796 " yourself if you want to.\n"
797 "An empty message aborts the commit.\n"), comment_line_char);
798 if (only_include_assumed)
799 status_printf_ln(s, GIT_COLOR_NORMAL,
800 "%s", only_include_assumed);
802 split_ident_or_die(&ai, author_ident);
803 split_ident_or_die(&ci, &committer_ident);
805 if (ident_cmp(&ai, &ci))
806 status_printf_ln(s, GIT_COLOR_NORMAL,
808 "Author: %.*s <%.*s>"),
809 ident_shown++ ? "" : "\n",
810 (int)(ai.name_end - ai.name_begin), ai.name_begin,
811 (int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
813 if (author_date_is_interesting())
814 status_printf_ln(s, GIT_COLOR_NORMAL,
817 ident_shown++ ? "" : "\n",
818 show_ident_date(&ai, DATE_NORMAL));
820 if (!committer_ident_sufficiently_given())
821 status_printf_ln(s, GIT_COLOR_NORMAL,
823 "Committer: %.*s <%.*s>"),
824 ident_shown++ ? "" : "\n",
825 (int)(ci.name_end - ci.name_begin), ci.name_begin,
826 (int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
829 status_printf_ln(s, GIT_COLOR_NORMAL, "");
831 saved_color_setting = s->use_color;
833 commitable = run_status(s->fp, index_file, prefix, 1, s);
834 s->use_color = saved_color_setting;
836 unsigned char sha1[20];
837 const char *parent = "HEAD";
839 if (!active_nr && read_cache() < 0)
840 die(_("Cannot read index"));
845 if (get_sha1(parent, sha1))
846 commitable = !!active_nr;
848 commitable = index_differs_from(parent, 0);
850 strbuf_release(&committer_ident);
855 * Reject an attempt to record a non-merge empty commit without
856 * explicit --allow-empty. In the cherry-pick case, it may be
857 * empty due to conflict resolution, which the user should okay.
859 if (!commitable && whence != FROM_MERGE && !allow_empty &&
860 !(amend && is_a_merge(current_head))) {
861 s->display_comment_prefix = old_display_comment_prefix;
862 run_status(stdout, index_file, prefix, 0, s);
864 fputs(_(empty_amend_advice), stderr);
865 else if (whence == FROM_CHERRY_PICK) {
866 fputs(_(empty_cherry_pick_advice), stderr);
867 if (!sequencer_in_use)
868 fputs(_(empty_cherry_pick_advice_single), stderr);
870 fputs(_(empty_cherry_pick_advice_multi), stderr);
876 * Re-read the index as pre-commit hook could have updated it,
877 * and write it out as a tree. We must do this before we invoke
878 * the editor and after we invoke run_status above.
881 read_cache_from(index_file);
882 if (update_main_cache_tree(0)) {
883 error(_("Error building trees"));
887 if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
888 git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
892 char index[PATH_MAX];
893 const char *env[2] = { NULL };
895 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
896 if (launch_editor(git_path(commit_editmsg), NULL, env)) {
898 _("Please supply the message using either -m or -F option.\n"));
904 run_commit_hook(use_editor, index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
911 static int rest_is_empty(struct strbuf *sb, int start)
916 /* Check if the rest is just whitespace and Signed-of-by's. */
917 for (i = start; i < sb->len; i++) {
918 nl = memchr(sb->buf + i, '\n', sb->len - i);
924 if (strlen(sign_off_header) <= eol - i &&
925 starts_with(sb->buf + i, sign_off_header)) {
930 if (!isspace(sb->buf[i++]))
938 * Find out if the message in the strbuf contains only whitespace and
939 * Signed-off-by lines.
941 static int message_is_empty(struct strbuf *sb)
943 if (cleanup_mode == CLEANUP_NONE && sb->len)
945 return rest_is_empty(sb, 0);
949 * See if the user edited the message in the editor or left what
950 * was in the template intact
952 static int template_untouched(struct strbuf *sb)
954 struct strbuf tmpl = STRBUF_INIT;
957 if (cleanup_mode == CLEANUP_NONE && sb->len)
960 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
963 stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
964 start = (char *)skip_prefix(sb->buf, tmpl.buf);
967 strbuf_release(&tmpl);
968 return rest_is_empty(sb, start - sb->buf);
971 static const char *find_author_by_nickname(const char *name)
973 struct rev_info revs;
974 struct commit *commit;
975 struct strbuf buf = STRBUF_INIT;
976 struct string_list mailmap = STRING_LIST_INIT_NODUP;
980 init_revisions(&revs, NULL);
981 strbuf_addf(&buf, "--author=%s", name);
986 setup_revisions(ac, av, &revs, NULL);
987 revs.mailmap = &mailmap;
988 read_mailmap(revs.mailmap, NULL);
990 prepare_revision_walk(&revs);
991 commit = get_revision(&revs);
993 struct pretty_print_context ctx = {0};
994 ctx.date_mode = DATE_NORMAL;
995 strbuf_release(&buf);
996 format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
997 clear_mailmap(&mailmap);
998 return strbuf_detach(&buf, NULL);
1000 die(_("No existing author found with '%s'"), name);
1004 static void handle_untracked_files_arg(struct wt_status *s)
1006 if (!untracked_files_arg)
1007 ; /* default already initialized */
1008 else if (!strcmp(untracked_files_arg, "no"))
1009 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1010 else if (!strcmp(untracked_files_arg, "normal"))
1011 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1012 else if (!strcmp(untracked_files_arg, "all"))
1013 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1015 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
1018 static const char *read_commit_message(const char *name)
1020 const char *out_enc;
1021 struct commit *commit;
1023 commit = lookup_commit_reference_by_name(name);
1025 die(_("could not lookup commit %s"), name);
1026 out_enc = get_commit_output_encoding();
1027 return logmsg_reencode(commit, NULL, out_enc);
1031 * Enumerate what needs to be propagated when --porcelain
1032 * is not in effect here.
1034 static struct status_deferred_config {
1035 enum status_format status_format;
1037 } status_deferred_config = {
1038 STATUS_FORMAT_UNSPECIFIED,
1039 -1 /* unspecified */
1042 static void finalize_deferred_config(struct wt_status *s)
1044 int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
1045 !s->null_termination);
1047 if (s->null_termination) {
1048 if (status_format == STATUS_FORMAT_NONE ||
1049 status_format == STATUS_FORMAT_UNSPECIFIED)
1050 status_format = STATUS_FORMAT_PORCELAIN;
1051 else if (status_format == STATUS_FORMAT_LONG)
1052 die(_("--long and -z are incompatible"));
1055 if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED)
1056 status_format = status_deferred_config.status_format;
1057 if (status_format == STATUS_FORMAT_UNSPECIFIED)
1058 status_format = STATUS_FORMAT_NONE;
1060 if (use_deferred_config && s->show_branch < 0)
1061 s->show_branch = status_deferred_config.show_branch;
1062 if (s->show_branch < 0)
1066 static int parse_and_validate_options(int argc, const char *argv[],
1067 const struct option *options,
1068 const char * const usage[],
1070 struct commit *current_head,
1071 struct wt_status *s)
1075 argc = parse_options(argc, argv, prefix, options, usage, 0);
1076 finalize_deferred_config(s);
1078 if (force_author && !strchr(force_author, '>'))
1079 force_author = find_author_by_nickname(force_author);
1081 if (force_author && renew_authorship)
1082 die(_("Using both --reset-author and --author does not make sense"));
1084 if (logfile || have_option_m || use_message || fixup_message)
1087 use_editor = edit_flag;
1089 /* Sanity check options */
1090 if (amend && !current_head)
1091 die(_("You have nothing to amend."));
1092 if (amend && whence != FROM_COMMIT) {
1093 if (whence == FROM_MERGE)
1094 die(_("You are in the middle of a merge -- cannot amend."));
1095 else if (whence == FROM_CHERRY_PICK)
1096 die(_("You are in the middle of a cherry-pick -- cannot amend."));
1098 if (fixup_message && squash_message)
1099 die(_("Options --squash and --fixup cannot be used together"));
1109 die(_("Only one of -c/-C/-F/--fixup can be used."));
1110 if (message.len && f > 0)
1111 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1112 if (f || message.len)
1113 template_file = NULL;
1115 use_message = edit_message;
1116 if (amend && !use_message && !fixup_message)
1117 use_message = "HEAD";
1118 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1119 die(_("--reset-author can be used only with -C, -c or --amend."));
1121 use_message_buffer = read_commit_message(use_message);
1122 if (!renew_authorship) {
1123 author_message = use_message;
1124 author_message_buffer = use_message_buffer;
1127 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1128 author_message = "CHERRY_PICK_HEAD";
1129 author_message_buffer = read_commit_message(author_message);
1132 if (patch_interactive)
1135 if (also + only + all + interactive > 1)
1136 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
1137 if (argc == 0 && (also || (only && !amend)))
1138 die(_("No paths with --include/--only does not make sense."));
1139 if (argc == 0 && only && amend)
1140 only_include_assumed = _("Clever... amending the last one with dirty index.");
1141 if (argc > 0 && !also && !only)
1142 only_include_assumed = _("Explicit paths specified without -i or -o; assuming --only paths...");
1143 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1144 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1145 else if (!strcmp(cleanup_arg, "verbatim"))
1146 cleanup_mode = CLEANUP_NONE;
1147 else if (!strcmp(cleanup_arg, "whitespace"))
1148 cleanup_mode = CLEANUP_SPACE;
1149 else if (!strcmp(cleanup_arg, "strip"))
1150 cleanup_mode = CLEANUP_ALL;
1151 else if (!strcmp(cleanup_arg, "scissors"))
1152 cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
1154 die(_("Invalid cleanup mode %s"), cleanup_arg);
1156 handle_untracked_files_arg(s);
1158 if (all && argc > 0)
1159 die(_("Paths with -a does not make sense."));
1161 if (status_format != STATUS_FORMAT_NONE)
1167 static int dry_run_commit(int argc, const char **argv, const char *prefix,
1168 const struct commit *current_head, struct wt_status *s)
1171 const char *index_file;
1173 index_file = prepare_index(argc, argv, prefix, current_head, 1);
1174 commitable = run_status(stdout, index_file, prefix, 0, s);
1175 rollback_index_files();
1177 return commitable ? 0 : 1;
1180 static int parse_status_slot(const char *var, int offset)
1182 if (!strcasecmp(var+offset, "header"))
1183 return WT_STATUS_HEADER;
1184 if (!strcasecmp(var+offset, "branch"))
1185 return WT_STATUS_ONBRANCH;
1186 if (!strcasecmp(var+offset, "updated")
1187 || !strcasecmp(var+offset, "added"))
1188 return WT_STATUS_UPDATED;
1189 if (!strcasecmp(var+offset, "changed"))
1190 return WT_STATUS_CHANGED;
1191 if (!strcasecmp(var+offset, "untracked"))
1192 return WT_STATUS_UNTRACKED;
1193 if (!strcasecmp(var+offset, "nobranch"))
1194 return WT_STATUS_NOBRANCH;
1195 if (!strcasecmp(var+offset, "unmerged"))
1196 return WT_STATUS_UNMERGED;
1200 static int git_status_config(const char *k, const char *v, void *cb)
1202 struct wt_status *s = cb;
1204 if (starts_with(k, "column."))
1205 return git_column_config(k, v, "status", &s->colopts);
1206 if (!strcmp(k, "status.submodulesummary")) {
1208 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1209 if (is_bool && s->submodule_summary)
1210 s->submodule_summary = -1;
1213 if (!strcmp(k, "status.short")) {
1214 if (git_config_bool(k, v))
1215 status_deferred_config.status_format = STATUS_FORMAT_SHORT;
1217 status_deferred_config.status_format = STATUS_FORMAT_NONE;
1220 if (!strcmp(k, "status.branch")) {
1221 status_deferred_config.show_branch = git_config_bool(k, v);
1224 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1225 s->use_color = git_config_colorbool(k, v);
1228 if (!strcmp(k, "status.displaycommentprefix")) {
1229 s->display_comment_prefix = git_config_bool(k, v);
1232 if (starts_with(k, "status.color.") || starts_with(k, "color.status.")) {
1233 int slot = parse_status_slot(k, 13);
1237 return config_error_nonbool(k);
1238 color_parse(v, k, s->color_palette[slot]);
1241 if (!strcmp(k, "status.relativepaths")) {
1242 s->relative_paths = git_config_bool(k, v);
1245 if (!strcmp(k, "status.showuntrackedfiles")) {
1247 return config_error_nonbool(k);
1248 else if (!strcmp(v, "no"))
1249 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1250 else if (!strcmp(v, "normal"))
1251 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1252 else if (!strcmp(v, "all"))
1253 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1255 return error(_("Invalid untracked files mode '%s'"), v);
1258 return git_diff_ui_config(k, v, NULL);
1261 int cmd_status(int argc, const char **argv, const char *prefix)
1263 static struct wt_status s;
1265 unsigned char sha1[20];
1266 static struct option builtin_status_options[] = {
1267 OPT__VERBOSE(&verbose, N_("be verbose")),
1268 OPT_SET_INT('s', "short", &status_format,
1269 N_("show status concisely"), STATUS_FORMAT_SHORT),
1270 OPT_BOOL('b', "branch", &s.show_branch,
1271 N_("show branch information")),
1272 OPT_SET_INT(0, "porcelain", &status_format,
1273 N_("machine-readable output"),
1274 STATUS_FORMAT_PORCELAIN),
1275 OPT_SET_INT(0, "long", &status_format,
1276 N_("show status in long format (default)"),
1277 STATUS_FORMAT_LONG),
1278 OPT_BOOL('z', "null", &s.null_termination,
1279 N_("terminate entries with NUL")),
1280 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1282 N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
1283 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1284 OPT_BOOL(0, "ignored", &show_ignored_in_status,
1285 N_("show ignored files")),
1286 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
1287 N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
1288 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1289 OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
1293 if (argc == 2 && !strcmp(argv[1], "-h"))
1294 usage_with_options(builtin_status_usage, builtin_status_options);
1296 status_init_config(&s, git_status_config);
1297 argc = parse_options(argc, argv, prefix,
1298 builtin_status_options,
1299 builtin_status_usage, 0);
1300 finalize_colopts(&s.colopts, -1);
1301 finalize_deferred_config(&s);
1303 handle_untracked_files_arg(&s);
1304 if (show_ignored_in_status)
1305 s.show_ignored_files = 1;
1306 parse_pathspec(&s.pathspec, 0,
1307 PATHSPEC_PREFER_FULL,
1310 read_cache_preload(&s.pathspec);
1311 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
1313 fd = hold_locked_index(&index_lock, 0);
1315 update_index_if_able(&the_index, &index_lock);
1317 s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1318 s.ignore_submodule_arg = ignore_submodule_arg;
1319 wt_status_collect(&s);
1321 if (s.relative_paths)
1324 switch (status_format) {
1325 case STATUS_FORMAT_SHORT:
1326 wt_shortstatus_print(&s);
1328 case STATUS_FORMAT_PORCELAIN:
1329 wt_porcelain_print(&s);
1331 case STATUS_FORMAT_UNSPECIFIED:
1332 die("BUG: finalize_deferred_config() should have been called");
1334 case STATUS_FORMAT_NONE:
1335 case STATUS_FORMAT_LONG:
1336 s.verbose = verbose;
1337 s.ignore_submodule_arg = ignore_submodule_arg;
1338 wt_status_print(&s);
1344 static void print_summary(const char *prefix, const unsigned char *sha1,
1347 struct rev_info rev;
1348 struct commit *commit;
1349 struct strbuf format = STRBUF_INIT;
1350 unsigned char junk_sha1[20];
1352 struct pretty_print_context pctx = {0};
1353 struct strbuf author_ident = STRBUF_INIT;
1354 struct strbuf committer_ident = STRBUF_INIT;
1356 commit = lookup_commit(sha1);
1358 die(_("couldn't look up newly created commit"));
1359 if (parse_commit(commit))
1360 die(_("could not parse newly created commit"));
1362 strbuf_addstr(&format, "format:%h] %s");
1364 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1365 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1366 if (strbuf_cmp(&author_ident, &committer_ident)) {
1367 strbuf_addstr(&format, "\n Author: ");
1368 strbuf_addbuf_percentquote(&format, &author_ident);
1370 if (author_date_is_interesting()) {
1371 struct strbuf date = STRBUF_INIT;
1372 format_commit_message(commit, "%ad", &date, &pctx);
1373 strbuf_addstr(&format, "\n Date: ");
1374 strbuf_addbuf_percentquote(&format, &date);
1375 strbuf_release(&date);
1377 if (!committer_ident_sufficiently_given()) {
1378 strbuf_addstr(&format, "\n Committer: ");
1379 strbuf_addbuf_percentquote(&format, &committer_ident);
1380 if (advice_implicit_identity) {
1381 strbuf_addch(&format, '\n');
1382 strbuf_addstr(&format, _(implicit_ident_advice));
1385 strbuf_release(&author_ident);
1386 strbuf_release(&committer_ident);
1388 init_revisions(&rev, prefix);
1389 setup_revisions(0, NULL, &rev, NULL);
1392 rev.diffopt.output_format =
1393 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1395 rev.verbose_header = 1;
1396 rev.show_root_diff = 1;
1397 get_commit_format(format.buf, &rev);
1398 rev.always_show_header = 0;
1399 rev.diffopt.detect_rename = 1;
1400 rev.diffopt.break_opt = 0;
1401 diff_setup_done(&rev.diffopt);
1403 head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1405 starts_with(head, "refs/heads/") ?
1407 !strcmp(head, "HEAD") ?
1408 _("detached HEAD") :
1410 initial_commit ? _(" (root-commit)") : "");
1412 if (!log_tree_commit(&rev, commit)) {
1413 rev.always_show_header = 1;
1414 rev.use_terminator = 1;
1415 log_tree_commit(&rev, commit);
1418 strbuf_release(&format);
1421 static int git_commit_config(const char *k, const char *v, void *cb)
1423 struct wt_status *s = cb;
1426 if (!strcmp(k, "commit.template"))
1427 return git_config_pathname(&template_file, k, v);
1428 if (!strcmp(k, "commit.status")) {
1429 include_status = git_config_bool(k, v);
1432 if (!strcmp(k, "commit.cleanup"))
1433 return git_config_string(&cleanup_arg, k, v);
1434 if (!strcmp(k, "commit.gpgsign")) {
1435 sign_commit = git_config_bool(k, v) ? "" : NULL;
1439 status = git_gpg_config(k, v, NULL);
1442 return git_status_config(k, v, s);
1445 static int run_rewrite_hook(const unsigned char *oldsha1,
1446 const unsigned char *newsha1)
1448 /* oldsha1 SP newsha1 LF NUL */
1449 static char buf[2*40 + 3];
1450 struct child_process proc;
1451 const char *argv[3];
1455 argv[0] = find_hook("post-rewrite");
1462 memset(&proc, 0, sizeof(proc));
1465 proc.stdout_to_stderr = 1;
1467 code = start_command(&proc);
1470 n = snprintf(buf, sizeof(buf), "%s %s\n",
1471 sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
1472 write_in_full(proc.in, buf, n);
1474 return finish_command(&proc);
1477 int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
1479 const char *hook_env[3] = { NULL };
1480 char index[PATH_MAX];
1484 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
1485 hook_env[0] = index;
1488 * Let the hook know that no editor will be launched.
1490 if (!editor_is_used)
1491 hook_env[1] = "GIT_EDITOR=:";
1493 va_start(args, name);
1494 ret = run_hook_ve(hook_env, name, args);
1500 int cmd_commit(int argc, const char **argv, const char *prefix)
1502 static struct wt_status s;
1503 static struct option builtin_commit_options[] = {
1504 OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
1505 OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
1507 OPT_GROUP(N_("Commit message options")),
1508 OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
1509 OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
1510 OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
1511 OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
1512 OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
1513 OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
1514 OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
1515 OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
1516 OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
1517 OPT_BOOL('s', "signoff", &signoff, N_("add Signed-off-by:")),
1518 OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
1519 OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
1520 OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
1521 OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
1522 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
1523 N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
1524 /* end commit message options */
1526 OPT_GROUP(N_("Commit contents options")),
1527 OPT_BOOL('a', "all", &all, N_("commit all changed files")),
1528 OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")),
1529 OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
1530 OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
1531 OPT_BOOL('o', "only", &only, N_("commit only specified files")),
1532 OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit hook")),
1533 OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),
1534 OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
1535 STATUS_FORMAT_SHORT),
1536 OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
1537 OPT_SET_INT(0, "porcelain", &status_format,
1538 N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
1539 OPT_SET_INT(0, "long", &status_format,
1540 N_("show status in long format (default)"),
1541 STATUS_FORMAT_LONG),
1542 OPT_BOOL('z', "null", &s.null_termination,
1543 N_("terminate entries with NUL")),
1544 OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
1545 OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
1546 { 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" },
1547 /* end commit contents options */
1549 OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
1550 N_("ok to record an empty change")),
1551 OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message,
1552 N_("ok to record a change with an empty message")),
1557 struct strbuf sb = STRBUF_INIT;
1558 struct strbuf author_ident = STRBUF_INIT;
1559 const char *index_file, *reflog_msg;
1561 unsigned char sha1[20];
1562 struct ref_lock *ref_lock;
1563 struct commit_list *parents = NULL, **pptr = &parents;
1564 struct stat statbuf;
1565 struct commit *current_head = NULL;
1566 struct commit_extra_header *extra = NULL;
1568 if (argc == 2 && !strcmp(argv[1], "-h"))
1569 usage_with_options(builtin_commit_usage, builtin_commit_options);
1571 status_init_config(&s, git_commit_config);
1572 status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
1575 if (get_sha1("HEAD", sha1))
1576 current_head = NULL;
1578 current_head = lookup_commit_or_die(sha1, "HEAD");
1579 if (parse_commit(current_head))
1580 die(_("could not parse HEAD commit"));
1582 argc = parse_and_validate_options(argc, argv, builtin_commit_options,
1583 builtin_commit_usage,
1584 prefix, current_head, &s);
1586 return dry_run_commit(argc, argv, prefix, current_head, &s);
1587 index_file = prepare_index(argc, argv, prefix, current_head, 0);
1589 /* Set up everything for writing the commit object. This includes
1590 running hooks, writing the trees, and interacting with the user. */
1591 if (!prepare_to_commit(index_file, prefix,
1592 current_head, &s, &author_ident)) {
1593 rollback_index_files();
1597 /* Determine parents */
1598 reflog_msg = getenv("GIT_REFLOG_ACTION");
1599 if (!current_head) {
1601 reflog_msg = "commit (initial)";
1603 struct commit_list *c;
1606 reflog_msg = "commit (amend)";
1607 for (c = current_head->parents; c; c = c->next)
1608 pptr = &commit_list_insert(c->item, pptr)->next;
1609 } else if (whence == FROM_MERGE) {
1610 struct strbuf m = STRBUF_INIT;
1612 int allow_fast_forward = 1;
1615 reflog_msg = "commit (merge)";
1616 pptr = &commit_list_insert(current_head, pptr)->next;
1617 fp = fopen(git_path("MERGE_HEAD"), "r");
1619 die_errno(_("could not open '%s' for reading"),
1620 git_path("MERGE_HEAD"));
1621 while (strbuf_getline(&m, fp, '\n') != EOF) {
1622 struct commit *parent;
1624 parent = get_merge_parent(m.buf);
1626 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1627 pptr = &commit_list_insert(parent, pptr)->next;
1631 if (!stat(git_path("MERGE_MODE"), &statbuf)) {
1632 if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1633 die_errno(_("could not read MERGE_MODE"));
1634 if (!strcmp(sb.buf, "no-ff"))
1635 allow_fast_forward = 0;
1637 if (allow_fast_forward)
1638 parents = reduce_heads(parents);
1641 reflog_msg = (whence == FROM_CHERRY_PICK)
1642 ? "commit (cherry-pick)"
1644 pptr = &commit_list_insert(current_head, pptr)->next;
1647 /* Finally, get the commit message */
1649 if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1650 int saved_errno = errno;
1651 rollback_index_files();
1652 die(_("could not read commit message: %s"), strerror(saved_errno));
1655 if (verbose || /* Truncate the message just before the diff, if any. */
1656 cleanup_mode == CLEANUP_SCISSORS)
1657 wt_status_truncate_message_at_cut_line(&sb);
1659 if (cleanup_mode != CLEANUP_NONE)
1660 stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1661 if (template_untouched(&sb) && !allow_empty_message) {
1662 rollback_index_files();
1663 fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
1666 if (message_is_empty(&sb) && !allow_empty_message) {
1667 rollback_index_files();
1668 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
1673 const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1674 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1676 struct commit_extra_header **tail = &extra;
1677 append_merge_tag_headers(parents, &tail);
1680 if (commit_tree_extended(&sb, active_cache_tree->sha1, parents, sha1,
1681 author_ident.buf, sign_commit, extra)) {
1682 rollback_index_files();
1683 die(_("failed to write commit object"));
1685 strbuf_release(&author_ident);
1686 free_commit_extra_headers(extra);
1688 ref_lock = lock_any_ref_for_update("HEAD",
1691 : current_head->object.sha1,
1694 nl = strchr(sb.buf, '\n');
1696 strbuf_setlen(&sb, nl + 1 - sb.buf);
1698 strbuf_addch(&sb, '\n');
1699 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1700 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1703 rollback_index_files();
1704 die(_("cannot lock HEAD ref"));
1706 if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1707 rollback_index_files();
1708 die(_("cannot update HEAD ref"));
1711 unlink(git_path("CHERRY_PICK_HEAD"));
1712 unlink(git_path("REVERT_HEAD"));
1713 unlink(git_path("MERGE_HEAD"));
1714 unlink(git_path("MERGE_MSG"));
1715 unlink(git_path("MERGE_MODE"));
1716 unlink(git_path("SQUASH_MSG"));
1718 if (commit_index_files())
1719 die (_("Repository has been updated, but unable to write\n"
1720 "new_index file. Check that disk is not full or quota is\n"
1721 "not exceeded, and then \"git reset HEAD\" to recover."));
1724 run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
1725 if (amend && !no_post_rewrite) {
1726 struct notes_rewrite_cfg *cfg;
1727 cfg = init_copy_notes_for_rewrite("amend");
1729 /* we are amending, so current_head is not NULL */
1730 copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1731 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1733 run_rewrite_hook(current_head->object.sha1, sha1);
1736 print_summary(prefix, sha1, !current_head);