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 static const char * const builtin_commit_usage[] = {
32 "git commit [options] [--] <filepattern>...",
36 static const char * const builtin_status_usage[] = {
37 "git status [options] [--] <filepattern>...",
41 static const char implicit_ident_advice[] =
42 N_("Your name and email address were configured automatically based\n"
43 "on your username and hostname. Please check that they are accurate.\n"
44 "You can suppress this message by setting them explicitly:\n"
46 " git config --global user.name \"Your Name\"\n"
47 " git config --global user.email you@example.com\n"
49 "After doing this, you may fix the identity used for this commit with:\n"
51 " git commit --amend --reset-author\n");
53 static const char empty_amend_advice[] =
54 N_("You asked to amend the most recent commit, but doing so would make\n"
55 "it empty. You can repeat your command with --allow-empty, or you can\n"
56 "remove the commit entirely with \"git reset HEAD^\".\n");
58 static const char empty_cherry_pick_advice[] =
59 N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
60 "If you wish to commit it anyway, use:\n"
62 " git commit --allow-empty\n"
64 "Otherwise, please use 'git reset'\n");
66 static const char *use_message_buffer;
67 static const char commit_editmsg[] = "COMMIT_EDITMSG";
68 static struct lock_file index_lock; /* real index */
69 static struct lock_file false_lock; /* used only for partial commits */
76 static const char *logfile, *force_author;
77 static const char *template_file;
79 * The _message variables are commit names from which to take
80 * the commit message and/or authorship.
82 static const char *author_message, *author_message_buffer;
83 static char *edit_message, *use_message;
84 static char *fixup_message, *squash_message;
85 static int all, also, interactive, patch_interactive, only, amend, signoff;
86 static int edit_flag = -1; /* unspecified */
87 static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
88 static int no_post_rewrite, allow_empty_message;
89 static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
90 static char *sign_commit;
93 * The default commit message cleanup mode will remove the lines
94 * beginning with # (shell comments) and leading and trailing
95 * whitespaces (empty lines or containing only whitespaces)
96 * if editor is used, and only the whitespaces if the message
97 * is specified explicitly.
104 static char *cleanup_arg;
106 static enum commit_whence whence;
107 static int use_editor = 1, include_status = 1;
108 static int show_ignored_in_status;
109 static const char *only_include_assumed;
110 static struct strbuf message = STRBUF_INIT;
112 static int null_termination;
116 STATUS_FORMAT_PORCELAIN
117 } status_format = STATUS_FORMAT_LONG;
118 static int status_show_branch;
120 static int opt_parse_m(const struct option *opt, const char *arg, int unset)
122 struct strbuf *buf = opt->value;
124 strbuf_setlen(buf, 0);
126 strbuf_addstr(buf, arg);
127 strbuf_addstr(buf, "\n\n");
132 static struct option builtin_commit_options[] = {
133 OPT__QUIET(&quiet, "suppress summary after successful commit"),
134 OPT__VERBOSE(&verbose, "show diff in commit message template"),
136 OPT_GROUP("Commit message options"),
137 OPT_FILENAME('F', "file", &logfile, "read message from file"),
138 OPT_STRING(0, "author", &force_author, "author", "override author for commit"),
139 OPT_STRING(0, "date", &force_date, "date", "override date for commit"),
140 OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m),
141 OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"),
142 OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"),
143 OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"),
144 OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"),
145 OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C/-c/--amend)"),
146 OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
147 OPT_FILENAME('t', "template", &template_file, "use specified template file"),
148 OPT_BOOL('e', "edit", &edit_flag, "force edit of commit"),
149 OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
150 OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
151 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id",
152 "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
153 /* end commit message options */
155 OPT_GROUP("Commit contents options"),
156 OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
157 OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
158 OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
159 OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"),
160 OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
161 OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
162 OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
163 OPT_SET_INT(0, "short", &status_format, "show status concisely",
164 STATUS_FORMAT_SHORT),
165 OPT_BOOLEAN(0, "branch", &status_show_branch, "show branch information"),
166 OPT_SET_INT(0, "porcelain", &status_format,
167 "machine-readable output", STATUS_FORMAT_PORCELAIN),
168 OPT_BOOLEAN('z', "null", &null_termination,
169 "terminate entries with NUL"),
170 OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
171 OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
172 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
173 /* end commit contents options */
175 { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
176 "ok to record an empty change",
177 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
178 { OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
179 "ok to record a change with an empty message",
180 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
185 static void determine_whence(struct wt_status *s)
187 if (file_exists(git_path("MERGE_HEAD")))
189 else if (file_exists(git_path("CHERRY_PICK_HEAD")))
190 whence = FROM_CHERRY_PICK;
192 whence = FROM_COMMIT;
197 static const char *whence_s(void)
207 case FROM_CHERRY_PICK:
215 static void rollback_index_files(void)
217 switch (commit_style) {
219 break; /* nothing to do */
221 rollback_lock_file(&index_lock);
224 rollback_lock_file(&index_lock);
225 rollback_lock_file(&false_lock);
230 static int commit_index_files(void)
234 switch (commit_style) {
236 break; /* nothing to do */
238 err = commit_lock_file(&index_lock);
241 err = commit_lock_file(&index_lock);
242 rollback_lock_file(&false_lock);
250 * Take a union of paths in the index and the named tree (typically, "HEAD"),
251 * and return the paths that match the given pattern in list.
253 static int list_paths(struct string_list *list, const char *with_tree,
254 const char *prefix, const char **pattern)
259 for (i = 0; pattern[i]; i++)
264 char *max_prefix = common_prefix(pattern);
265 overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
269 for (i = 0; i < active_nr; i++) {
270 struct cache_entry *ce = active_cache[i];
271 struct string_list_item *item;
273 if (ce->ce_flags & CE_UPDATE)
275 if (!match_pathspec(pattern, ce->name, ce_namelen(ce), 0, m))
277 item = string_list_insert(list, ce->name);
278 if (ce_skip_worktree(ce))
279 item->util = item; /* better a valid pointer than a fake one */
282 return report_path_error(m, pattern, prefix);
285 static void add_remove_files(struct string_list *list)
288 for (i = 0; i < list->nr; i++) {
290 struct string_list_item *p = &(list->items[i]);
292 /* p->util is skip-worktree */
296 if (!lstat(p->string, &st)) {
297 if (add_to_cache(p->string, &st, 0))
298 die(_("updating files failed"));
300 remove_file_from_cache(p->string);
304 static void create_base_index(const struct commit *current_head)
307 struct unpack_trees_options opts;
315 memset(&opts, 0, sizeof(opts));
319 opts.src_index = &the_index;
320 opts.dst_index = &the_index;
322 opts.fn = oneway_merge;
323 tree = parse_tree_indirect(current_head->object.sha1);
325 die(_("failed to unpack HEAD tree object"));
327 init_tree_desc(&t, tree->buffer, tree->size);
328 if (unpack_trees(1, &t, &opts))
329 exit(128); /* We've already reported the error, finish dying */
332 static void refresh_cache_or_die(int refresh_flags)
335 * refresh_flags contains REFRESH_QUIET, so the only errors
336 * are for unmerged entries.
338 if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
339 die_resolve_conflict("commit");
342 static char *prepare_index(int argc, const char **argv, const char *prefix,
343 const struct commit *current_head, int is_status)
346 struct string_list partial;
347 const char **pathspec = NULL;
348 char *old_index_env = NULL;
349 int refresh_flags = REFRESH_QUIET;
352 refresh_flags |= REFRESH_UNMERGED;
355 pathspec = get_pathspec(prefix, argv);
357 if (read_cache_preload(pathspec) < 0)
358 die(_("index file corrupt"));
361 fd = hold_locked_index(&index_lock, 1);
363 refresh_cache_or_die(refresh_flags);
365 if (write_cache(fd, active_cache, active_nr) ||
366 close_lock_file(&index_lock))
367 die(_("unable to create temporary index"));
369 old_index_env = getenv(INDEX_ENVIRONMENT);
370 setenv(INDEX_ENVIRONMENT, index_lock.filename, 1);
372 if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
373 die(_("interactive add failed"));
375 if (old_index_env && *old_index_env)
376 setenv(INDEX_ENVIRONMENT, old_index_env, 1);
378 unsetenv(INDEX_ENVIRONMENT);
381 read_cache_from(index_lock.filename);
383 commit_style = COMMIT_NORMAL;
384 return index_lock.filename;
388 * Non partial, non as-is commit.
390 * (1) get the real index;
391 * (2) update the_index as necessary;
392 * (3) write the_index out to the real index (still locked);
393 * (4) return the name of the locked index file.
395 * The caller should run hooks on the locked real index, and
396 * (A) if all goes well, commit the real index;
397 * (B) on failure, rollback the real index.
399 if (all || (also && pathspec && *pathspec)) {
400 fd = hold_locked_index(&index_lock, 1);
401 add_files_to_cache(also ? prefix : NULL, pathspec, 0);
402 refresh_cache_or_die(refresh_flags);
403 update_main_cache_tree(1);
404 if (write_cache(fd, active_cache, active_nr) ||
405 close_lock_file(&index_lock))
406 die(_("unable to write new_index file"));
407 commit_style = COMMIT_NORMAL;
408 return index_lock.filename;
414 * (1) return the name of the real index file.
416 * The caller should run hooks on the real index,
417 * and create commit from the_index.
418 * We still need to refresh the index here.
420 if (!pathspec || !*pathspec) {
421 fd = hold_locked_index(&index_lock, 1);
422 refresh_cache_or_die(refresh_flags);
423 if (active_cache_changed) {
424 update_main_cache_tree(1);
425 if (write_cache(fd, active_cache, active_nr) ||
426 commit_locked_index(&index_lock))
427 die(_("unable to write new_index file"));
429 rollback_lock_file(&index_lock);
431 commit_style = COMMIT_AS_IS;
432 return get_index_file();
438 * (0) find the set of affected paths;
439 * (1) get lock on the real index file;
440 * (2) update the_index with the given paths;
441 * (3) write the_index out to the real index (still locked);
442 * (4) get lock on the false index file;
443 * (5) reset the_index from HEAD;
444 * (6) update the_index the same way as (2);
445 * (7) write the_index out to the false index file;
446 * (8) return the name of the false index file (still locked);
448 * The caller should run hooks on the locked false index, and
449 * create commit from it. Then
450 * (A) if all goes well, commit the real index;
451 * (B) on failure, rollback the real index;
452 * In either case, rollback the false index.
454 commit_style = COMMIT_PARTIAL;
456 if (whence != FROM_COMMIT)
457 die(_("cannot do a partial commit during a %s."), whence_s());
459 memset(&partial, 0, sizeof(partial));
460 partial.strdup_strings = 1;
461 if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec))
465 if (read_cache() < 0)
466 die(_("cannot read the index"));
468 fd = hold_locked_index(&index_lock, 1);
469 add_remove_files(&partial);
470 refresh_cache(REFRESH_QUIET);
471 if (write_cache(fd, active_cache, active_nr) ||
472 close_lock_file(&index_lock))
473 die(_("unable to write new_index file"));
475 fd = hold_lock_file_for_update(&false_lock,
476 git_path("next-index-%"PRIuMAX,
477 (uintmax_t) getpid()),
480 create_base_index(current_head);
481 add_remove_files(&partial);
482 refresh_cache(REFRESH_QUIET);
484 if (write_cache(fd, active_cache, active_nr) ||
485 close_lock_file(&false_lock))
486 die(_("unable to write temporary index file"));
489 read_cache_from(false_lock.filename);
491 return false_lock.filename;
494 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
497 unsigned char sha1[20];
499 if (s->relative_paths)
504 s->reference = "HEAD^1";
506 s->verbose = verbose;
507 s->index_file = index_file;
510 s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
512 wt_status_collect(s);
514 switch (status_format) {
515 case STATUS_FORMAT_SHORT:
516 wt_shortstatus_print(s, null_termination, status_show_branch);
518 case STATUS_FORMAT_PORCELAIN:
519 wt_porcelain_print(s, null_termination);
521 case STATUS_FORMAT_LONG:
526 return s->commitable;
529 static int is_a_merge(const struct commit *current_head)
531 return !!(current_head->parents && current_head->parents->next);
534 static const char sign_off_header[] = "Signed-off-by: ";
536 static void determine_author_info(struct strbuf *author_ident)
538 char *name, *email, *date;
540 name = getenv("GIT_AUTHOR_NAME");
541 email = getenv("GIT_AUTHOR_EMAIL");
542 date = getenv("GIT_AUTHOR_DATE");
544 if (author_message) {
545 const char *a, *lb, *rb, *eol;
547 a = strstr(author_message_buffer, "\nauthor ");
549 die(_("invalid commit: %s"), author_message);
551 lb = strchrnul(a + strlen("\nauthor "), '<');
552 rb = strchrnul(lb, '>');
553 eol = strchrnul(rb, '\n');
554 if (!*lb || !*rb || !*eol)
555 die(_("invalid commit: %s"), author_message);
557 if (lb == a + strlen("\nauthor "))
558 /* \nauthor <foo@example.com> */
559 name = xcalloc(1, 1);
561 name = xmemdupz(a + strlen("\nauthor "),
563 (a + strlen("\nauthor "))));
564 email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
565 date = xmemdupz(rb + strlen("> "), eol - (rb + strlen("> ")));
569 const char *lb = strstr(force_author, " <");
570 const char *rb = strchr(force_author, '>');
573 die(_("malformed --author parameter"));
574 name = xstrndup(force_author, lb - force_author);
575 email = xstrndup(lb + 2, rb - (lb + 2));
580 strbuf_addstr(author_ident, fmt_ident(name, email, date,
581 IDENT_ERROR_ON_NO_NAME));
584 static int ends_rfc2822_footer(struct strbuf *sb)
591 const char *buf = sb->buf;
593 for (i = len - 1; i > 0; i--) {
594 if (hit && buf[i] == '\n')
596 hit = (buf[i] == '\n');
599 while (i < len - 1 && buf[i] == '\n')
602 for (; i < len; i = k) {
603 for (k = i; k < len && buf[k] != '\n'; k++)
607 if ((buf[k] == ' ' || buf[k] == '\t') && !first)
612 for (j = 0; i + j < len; j++) {
625 static char *cut_ident_timestamp_part(char *string)
627 char *ket = strrchr(string, '>');
628 if (!ket || ket[1] != ' ')
629 die(_("Malformed ident string: '%s'"), string);
634 static int prepare_to_commit(const char *index_file, const char *prefix,
635 struct commit *current_head,
637 struct strbuf *author_ident)
640 struct strbuf committer_ident = STRBUF_INIT;
641 int commitable, saved_color_setting;
642 struct strbuf sb = STRBUF_INIT;
644 const char *hook_arg1 = NULL;
645 const char *hook_arg2 = NULL;
647 int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
649 if (!no_verify && run_hook(index_file, "pre-commit", NULL))
652 if (squash_message) {
654 * Insert the proper subject line before other commit
655 * message options add their content.
657 if (use_message && !strcmp(use_message, squash_message))
658 strbuf_addstr(&sb, "squash! ");
660 struct pretty_print_context ctx = {0};
662 c = lookup_commit_reference_by_name(squash_message);
664 die(_("could not lookup commit %s"), squash_message);
665 ctx.output_encoding = get_commit_output_encoding();
666 format_commit_message(c, "squash! %s\n\n", &sb,
672 strbuf_addbuf(&sb, &message);
673 hook_arg1 = "message";
674 } else if (logfile && !strcmp(logfile, "-")) {
676 fprintf(stderr, _("(reading log message from standard input)\n"));
677 if (strbuf_read(&sb, 0, 0) < 0)
678 die_errno(_("could not read log from standard input"));
679 hook_arg1 = "message";
680 } else if (logfile) {
681 if (strbuf_read_file(&sb, logfile, 0) < 0)
682 die_errno(_("could not read log file '%s'"),
684 hook_arg1 = "message";
685 } else if (use_message) {
686 buffer = strstr(use_message_buffer, "\n\n");
687 if (!buffer || buffer[2] == '\0')
688 die(_("commit has empty message"));
689 strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
690 hook_arg1 = "commit";
691 hook_arg2 = use_message;
692 } else if (fixup_message) {
693 struct pretty_print_context ctx = {0};
694 struct commit *commit;
695 commit = lookup_commit_reference_by_name(fixup_message);
697 die(_("could not lookup commit %s"), fixup_message);
698 ctx.output_encoding = get_commit_output_encoding();
699 format_commit_message(commit, "fixup! %s\n\n",
701 hook_arg1 = "message";
702 } else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
703 if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
704 die_errno(_("could not read MERGE_MSG"));
706 } else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
707 if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
708 die_errno(_("could not read SQUASH_MSG"));
709 hook_arg1 = "squash";
710 } else if (template_file) {
711 if (strbuf_read_file(&sb, template_file, 0) < 0)
712 die_errno(_("could not read '%s'"), template_file);
713 hook_arg1 = "template";
714 clean_message_contents = 0;
718 * The remaining cases don't modify the template message, but
719 * just set the argument(s) to the prepare-commit-msg hook.
721 else if (whence == FROM_MERGE)
723 else if (whence == FROM_CHERRY_PICK) {
724 hook_arg1 = "commit";
725 hook_arg2 = "CHERRY_PICK_HEAD";
728 if (squash_message) {
730 * If squash_commit was used for the commit subject,
731 * then we're possibly hijacking other commit log options.
732 * Reset the hook args to tell the real story.
734 hook_arg1 = "message";
738 s->fp = fopen(git_path(commit_editmsg), "w");
740 die_errno(_("could not open '%s'"), git_path(commit_editmsg));
742 if (clean_message_contents)
746 struct strbuf sob = STRBUF_INIT;
749 strbuf_addstr(&sob, sign_off_header);
750 strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
751 getenv("GIT_COMMITTER_EMAIL")));
752 strbuf_addch(&sob, '\n');
753 for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
755 if (prefixcmp(sb.buf + i, sob.buf)) {
756 if (!i || !ends_rfc2822_footer(&sb))
757 strbuf_addch(&sb, '\n');
758 strbuf_addbuf(&sb, &sob);
760 strbuf_release(&sob);
763 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
764 die_errno(_("could not write commit template"));
768 /* This checks and barfs if author is badly specified */
769 determine_author_info(author_ident);
771 /* This checks if committer ident is explicitly given */
772 strbuf_addstr(&committer_ident, git_committer_info(0));
773 if (use_editor && include_status) {
774 char *ai_tmp, *ci_tmp;
775 if (whence != FROM_COMMIT)
776 status_printf_ln(s, GIT_COLOR_NORMAL,
778 "It looks like you may be committing a %s.\n"
779 "If this is not correct, please remove the file\n"
784 git_path(whence == FROM_MERGE
786 : "CHERRY_PICK_HEAD"));
788 fprintf(s->fp, "\n");
789 status_printf(s, GIT_COLOR_NORMAL,
790 _("Please enter the commit message for your changes."));
791 if (cleanup_mode == CLEANUP_ALL)
792 status_printf_more(s, GIT_COLOR_NORMAL,
793 _(" Lines starting\n"
794 "with '#' will be ignored, and an empty"
795 " message aborts the commit.\n"));
796 else /* CLEANUP_SPACE, that is. */
797 status_printf_more(s, GIT_COLOR_NORMAL,
798 _(" Lines starting\n"
799 "with '#' will be kept; you may remove them"
800 " yourself if you want to.\n"
801 "An empty message aborts the commit.\n"));
802 if (only_include_assumed)
803 status_printf_ln(s, GIT_COLOR_NORMAL,
804 "%s", only_include_assumed);
806 ai_tmp = cut_ident_timestamp_part(author_ident->buf);
807 ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
808 if (strcmp(author_ident->buf, committer_ident.buf))
809 status_printf_ln(s, GIT_COLOR_NORMAL,
812 ident_shown++ ? "" : "\n",
815 if (!user_ident_sufficiently_given())
816 status_printf_ln(s, GIT_COLOR_NORMAL,
819 ident_shown++ ? "" : "\n",
820 committer_ident.buf);
823 status_printf_ln(s, GIT_COLOR_NORMAL, "");
825 saved_color_setting = s->use_color;
827 commitable = run_status(s->fp, index_file, prefix, 1, s);
828 s->use_color = saved_color_setting;
833 unsigned char sha1[20];
834 const char *parent = "HEAD";
836 if (!active_nr && read_cache() < 0)
837 die(_("Cannot read index"));
842 if (get_sha1(parent, sha1))
843 commitable = !!active_nr;
845 commitable = index_differs_from(parent, 0);
847 strbuf_release(&committer_ident);
852 * Reject an attempt to record a non-merge empty commit without
853 * explicit --allow-empty. In the cherry-pick case, it may be
854 * empty due to conflict resolution, which the user should okay.
856 if (!commitable && whence != FROM_MERGE && !allow_empty &&
857 !(amend && is_a_merge(current_head))) {
858 run_status(stdout, index_file, prefix, 0, s);
860 fputs(_(empty_amend_advice), stderr);
861 else if (whence == FROM_CHERRY_PICK)
862 fputs(_(empty_cherry_pick_advice), stderr);
867 * Re-read the index as pre-commit hook could have updated it,
868 * and write it out as a tree. We must do this before we invoke
869 * the editor and after we invoke run_status above.
872 read_cache_from(index_file);
873 if (update_main_cache_tree(0)) {
874 error(_("Error building trees"));
878 if (run_hook(index_file, "prepare-commit-msg",
879 git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
883 char index[PATH_MAX];
884 const char *env[2] = { NULL };
886 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
887 if (launch_editor(git_path(commit_editmsg), NULL, env)) {
889 _("Please supply the message using either -m or -F option.\n"));
895 run_hook(index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
902 static int rest_is_empty(struct strbuf *sb, int start)
907 /* Check if the rest is just whitespace and Signed-of-by's. */
908 for (i = start; i < sb->len; i++) {
909 nl = memchr(sb->buf + i, '\n', sb->len - i);
915 if (strlen(sign_off_header) <= eol - i &&
916 !prefixcmp(sb->buf + i, sign_off_header)) {
921 if (!isspace(sb->buf[i++]))
929 * Find out if the message in the strbuf contains only whitespace and
930 * Signed-off-by lines.
932 static int message_is_empty(struct strbuf *sb)
934 if (cleanup_mode == CLEANUP_NONE && sb->len)
936 return rest_is_empty(sb, 0);
940 * See if the user edited the message in the editor or left what
941 * was in the template intact
943 static int template_untouched(struct strbuf *sb)
945 struct strbuf tmpl = STRBUF_INIT;
948 if (cleanup_mode == CLEANUP_NONE && sb->len)
951 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
954 stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
955 start = (char *)skip_prefix(sb->buf, tmpl.buf);
958 strbuf_release(&tmpl);
959 return rest_is_empty(sb, start - sb->buf);
962 static const char *find_author_by_nickname(const char *name)
964 struct rev_info revs;
965 struct commit *commit;
966 struct strbuf buf = STRBUF_INIT;
970 init_revisions(&revs, NULL);
971 strbuf_addf(&buf, "--author=%s", name);
976 setup_revisions(ac, av, &revs, NULL);
977 prepare_revision_walk(&revs);
978 commit = get_revision(&revs);
980 struct pretty_print_context ctx = {0};
981 ctx.date_mode = DATE_NORMAL;
982 strbuf_release(&buf);
983 format_commit_message(commit, "%an <%ae>", &buf, &ctx);
984 return strbuf_detach(&buf, NULL);
986 die(_("No existing author found with '%s'"), name);
990 static void handle_untracked_files_arg(struct wt_status *s)
992 if (!untracked_files_arg)
993 ; /* default already initialized */
994 else if (!strcmp(untracked_files_arg, "no"))
995 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
996 else if (!strcmp(untracked_files_arg, "normal"))
997 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
998 else if (!strcmp(untracked_files_arg, "all"))
999 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1001 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
1004 static const char *read_commit_message(const char *name)
1006 const char *out_enc, *out;
1007 struct commit *commit;
1009 commit = lookup_commit_reference_by_name(name);
1011 die(_("could not lookup commit %s"), name);
1012 out_enc = get_commit_output_encoding();
1013 out = logmsg_reencode(commit, out_enc);
1016 * If we failed to reencode the buffer, just copy it
1017 * byte for byte so the user can try to fix it up.
1018 * This also handles the case where input and output
1019 * encodings are identical.
1022 out = xstrdup(commit->buffer);
1026 static int parse_and_validate_options(int argc, const char *argv[],
1027 const char * const usage[],
1029 struct commit *current_head,
1030 struct wt_status *s)
1034 argc = parse_options(argc, argv, prefix, builtin_commit_options, usage,
1037 if (force_author && !strchr(force_author, '>'))
1038 force_author = find_author_by_nickname(force_author);
1040 if (force_author && renew_authorship)
1041 die(_("Using both --reset-author and --author does not make sense"));
1043 if (logfile || message.len || use_message || fixup_message)
1046 use_editor = edit_flag;
1048 setenv("GIT_EDITOR", ":", 1);
1050 /* Sanity check options */
1051 if (amend && !current_head)
1052 die(_("You have nothing to amend."));
1053 if (amend && whence != FROM_COMMIT)
1054 die(_("You are in the middle of a %s -- cannot amend."), whence_s());
1055 if (fixup_message && squash_message)
1056 die(_("Options --squash and --fixup cannot be used together"));
1066 die(_("Only one of -c/-C/-F/--fixup can be used."));
1067 if (message.len && f > 0)
1068 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1069 if (f || message.len)
1070 template_file = NULL;
1072 use_message = edit_message;
1073 if (amend && !use_message && !fixup_message)
1074 use_message = "HEAD";
1075 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1076 die(_("--reset-author can be used only with -C, -c or --amend."));
1078 use_message_buffer = read_commit_message(use_message);
1079 if (!renew_authorship) {
1080 author_message = use_message;
1081 author_message_buffer = use_message_buffer;
1084 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1085 author_message = "CHERRY_PICK_HEAD";
1086 author_message_buffer = read_commit_message(author_message);
1089 if (patch_interactive)
1092 if (!!also + !!only + !!all + !!interactive > 1)
1093 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
1094 if (argc == 0 && (also || (only && !amend)))
1095 die(_("No paths with --include/--only does not make sense."));
1096 if (argc == 0 && only && amend)
1097 only_include_assumed = _("Clever... amending the last one with dirty index.");
1098 if (argc > 0 && !also && !only)
1099 only_include_assumed = _("Explicit paths specified without -i nor -o; assuming --only paths...");
1100 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1101 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1102 else if (!strcmp(cleanup_arg, "verbatim"))
1103 cleanup_mode = CLEANUP_NONE;
1104 else if (!strcmp(cleanup_arg, "whitespace"))
1105 cleanup_mode = CLEANUP_SPACE;
1106 else if (!strcmp(cleanup_arg, "strip"))
1107 cleanup_mode = CLEANUP_ALL;
1109 die(_("Invalid cleanup mode %s"), cleanup_arg);
1111 handle_untracked_files_arg(s);
1113 if (all && argc > 0)
1114 die(_("Paths with -a does not make sense."));
1116 if (null_termination && status_format == STATUS_FORMAT_LONG)
1117 status_format = STATUS_FORMAT_PORCELAIN;
1118 if (status_format != STATUS_FORMAT_LONG)
1124 static int dry_run_commit(int argc, const char **argv, const char *prefix,
1125 const struct commit *current_head, struct wt_status *s)
1128 const char *index_file;
1130 index_file = prepare_index(argc, argv, prefix, current_head, 1);
1131 commitable = run_status(stdout, index_file, prefix, 0, s);
1132 rollback_index_files();
1134 return commitable ? 0 : 1;
1137 static int parse_status_slot(const char *var, int offset)
1139 if (!strcasecmp(var+offset, "header"))
1140 return WT_STATUS_HEADER;
1141 if (!strcasecmp(var+offset, "branch"))
1142 return WT_STATUS_ONBRANCH;
1143 if (!strcasecmp(var+offset, "updated")
1144 || !strcasecmp(var+offset, "added"))
1145 return WT_STATUS_UPDATED;
1146 if (!strcasecmp(var+offset, "changed"))
1147 return WT_STATUS_CHANGED;
1148 if (!strcasecmp(var+offset, "untracked"))
1149 return WT_STATUS_UNTRACKED;
1150 if (!strcasecmp(var+offset, "nobranch"))
1151 return WT_STATUS_NOBRANCH;
1152 if (!strcasecmp(var+offset, "unmerged"))
1153 return WT_STATUS_UNMERGED;
1157 static int git_status_config(const char *k, const char *v, void *cb)
1159 struct wt_status *s = cb;
1161 if (!strcmp(k, "status.submodulesummary")) {
1163 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1164 if (is_bool && s->submodule_summary)
1165 s->submodule_summary = -1;
1168 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1169 s->use_color = git_config_colorbool(k, v);
1172 if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
1173 int slot = parse_status_slot(k, 13);
1177 return config_error_nonbool(k);
1178 color_parse(v, k, s->color_palette[slot]);
1181 if (!strcmp(k, "status.relativepaths")) {
1182 s->relative_paths = git_config_bool(k, v);
1185 if (!strcmp(k, "status.showuntrackedfiles")) {
1187 return config_error_nonbool(k);
1188 else if (!strcmp(v, "no"))
1189 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1190 else if (!strcmp(v, "normal"))
1191 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1192 else if (!strcmp(v, "all"))
1193 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1195 return error(_("Invalid untracked files mode '%s'"), v);
1198 return git_diff_ui_config(k, v, NULL);
1201 int cmd_status(int argc, const char **argv, const char *prefix)
1205 unsigned char sha1[20];
1206 static struct option builtin_status_options[] = {
1207 OPT__VERBOSE(&verbose, "be verbose"),
1208 OPT_SET_INT('s', "short", &status_format,
1209 "show status concisely", STATUS_FORMAT_SHORT),
1210 OPT_BOOLEAN('b', "branch", &status_show_branch,
1211 "show branch information"),
1212 OPT_SET_INT(0, "porcelain", &status_format,
1213 "machine-readable output",
1214 STATUS_FORMAT_PORCELAIN),
1215 OPT_BOOLEAN('z', "null", &null_termination,
1216 "terminate entries with NUL"),
1217 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1219 "show untracked files, optional modes: all, normal, no. (Default: all)",
1220 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1221 OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
1222 "show ignored files"),
1223 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when",
1224 "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)",
1225 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1229 if (argc == 2 && !strcmp(argv[1], "-h"))
1230 usage_with_options(builtin_status_usage, builtin_status_options);
1232 wt_status_prepare(&s);
1233 gitmodules_config();
1234 git_config(git_status_config, &s);
1235 determine_whence(&s);
1236 argc = parse_options(argc, argv, prefix,
1237 builtin_status_options,
1238 builtin_status_usage, 0);
1240 if (null_termination && status_format == STATUS_FORMAT_LONG)
1241 status_format = STATUS_FORMAT_PORCELAIN;
1243 handle_untracked_files_arg(&s);
1244 if (show_ignored_in_status)
1245 s.show_ignored_files = 1;
1247 s.pathspec = get_pathspec(prefix, argv);
1249 read_cache_preload(s.pathspec);
1250 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);
1252 fd = hold_locked_index(&index_lock, 0);
1254 update_index_if_able(&the_index, &index_lock);
1256 s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1257 s.ignore_submodule_arg = ignore_submodule_arg;
1258 wt_status_collect(&s);
1260 if (s.relative_paths)
1263 switch (status_format) {
1264 case STATUS_FORMAT_SHORT:
1265 wt_shortstatus_print(&s, null_termination, status_show_branch);
1267 case STATUS_FORMAT_PORCELAIN:
1268 wt_porcelain_print(&s, null_termination);
1270 case STATUS_FORMAT_LONG:
1271 s.verbose = verbose;
1272 s.ignore_submodule_arg = ignore_submodule_arg;
1273 wt_status_print(&s);
1279 static void print_summary(const char *prefix, const unsigned char *sha1,
1282 struct rev_info rev;
1283 struct commit *commit;
1284 struct strbuf format = STRBUF_INIT;
1285 unsigned char junk_sha1[20];
1287 struct pretty_print_context pctx = {0};
1288 struct strbuf author_ident = STRBUF_INIT;
1289 struct strbuf committer_ident = STRBUF_INIT;
1291 commit = lookup_commit(sha1);
1293 die(_("couldn't look up newly created commit"));
1294 if (!commit || parse_commit(commit))
1295 die(_("could not parse newly created commit"));
1297 strbuf_addstr(&format, "format:%h] %s");
1299 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1300 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1301 if (strbuf_cmp(&author_ident, &committer_ident)) {
1302 strbuf_addstr(&format, "\n Author: ");
1303 strbuf_addbuf_percentquote(&format, &author_ident);
1305 if (!user_ident_sufficiently_given()) {
1306 strbuf_addstr(&format, "\n Committer: ");
1307 strbuf_addbuf_percentquote(&format, &committer_ident);
1308 if (advice_implicit_identity) {
1309 strbuf_addch(&format, '\n');
1310 strbuf_addstr(&format, _(implicit_ident_advice));
1313 strbuf_release(&author_ident);
1314 strbuf_release(&committer_ident);
1316 init_revisions(&rev, prefix);
1317 setup_revisions(0, NULL, &rev, NULL);
1320 rev.diffopt.output_format =
1321 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1323 rev.verbose_header = 1;
1324 rev.show_root_diff = 1;
1325 get_commit_format(format.buf, &rev);
1326 rev.always_show_header = 0;
1327 rev.diffopt.detect_rename = 1;
1328 rev.diffopt.break_opt = 0;
1329 diff_setup_done(&rev.diffopt);
1331 head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1333 !prefixcmp(head, "refs/heads/") ?
1335 !strcmp(head, "HEAD") ?
1336 _("detached HEAD") :
1338 initial_commit ? _(" (root-commit)") : "");
1340 if (!log_tree_commit(&rev, commit)) {
1341 rev.always_show_header = 1;
1342 rev.use_terminator = 1;
1343 log_tree_commit(&rev, commit);
1346 strbuf_release(&format);
1349 static int git_commit_config(const char *k, const char *v, void *cb)
1351 struct wt_status *s = cb;
1354 if (!strcmp(k, "commit.template"))
1355 return git_config_pathname(&template_file, k, v);
1356 if (!strcmp(k, "commit.status")) {
1357 include_status = git_config_bool(k, v);
1361 status = git_gpg_config(k, v, NULL);
1364 return git_status_config(k, v, s);
1367 static const char post_rewrite_hook[] = "hooks/post-rewrite";
1369 static int run_rewrite_hook(const unsigned char *oldsha1,
1370 const unsigned char *newsha1)
1372 /* oldsha1 SP newsha1 LF NUL */
1373 static char buf[2*40 + 3];
1374 struct child_process proc;
1375 const char *argv[3];
1379 if (access(git_path(post_rewrite_hook), X_OK) < 0)
1382 argv[0] = git_path(post_rewrite_hook);
1386 memset(&proc, 0, sizeof(proc));
1389 proc.stdout_to_stderr = 1;
1391 code = start_command(&proc);
1394 n = snprintf(buf, sizeof(buf), "%s %s\n",
1395 sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
1396 write_in_full(proc.in, buf, n);
1398 return finish_command(&proc);
1401 int cmd_commit(int argc, const char **argv, const char *prefix)
1403 struct strbuf sb = STRBUF_INIT;
1404 struct strbuf author_ident = STRBUF_INIT;
1405 const char *index_file, *reflog_msg;
1407 unsigned char sha1[20];
1408 struct ref_lock *ref_lock;
1409 struct commit_list *parents = NULL, **pptr = &parents;
1410 struct stat statbuf;
1411 int allow_fast_forward = 1;
1413 struct commit *current_head = NULL;
1414 struct commit_extra_header *extra = NULL;
1416 if (argc == 2 && !strcmp(argv[1], "-h"))
1417 usage_with_options(builtin_commit_usage, builtin_commit_options);
1419 wt_status_prepare(&s);
1420 git_config(git_commit_config, &s);
1421 determine_whence(&s);
1423 if (get_sha1("HEAD", sha1))
1424 current_head = NULL;
1426 current_head = lookup_commit_or_die(sha1, "HEAD");
1427 if (!current_head || parse_commit(current_head))
1428 die(_("could not parse HEAD commit"));
1430 argc = parse_and_validate_options(argc, argv, builtin_commit_usage,
1431 prefix, current_head, &s);
1433 return dry_run_commit(argc, argv, prefix, current_head, &s);
1434 index_file = prepare_index(argc, argv, prefix, current_head, 0);
1436 /* Set up everything for writing the commit object. This includes
1437 running hooks, writing the trees, and interacting with the user. */
1438 if (!prepare_to_commit(index_file, prefix,
1439 current_head, &s, &author_ident)) {
1440 rollback_index_files();
1444 /* Determine parents */
1445 reflog_msg = getenv("GIT_REFLOG_ACTION");
1446 if (!current_head) {
1448 reflog_msg = "commit (initial)";
1450 struct commit_list *c;
1453 reflog_msg = "commit (amend)";
1454 for (c = current_head->parents; c; c = c->next)
1455 pptr = &commit_list_insert(c->item, pptr)->next;
1456 } else if (whence == FROM_MERGE) {
1457 struct strbuf m = STRBUF_INIT;
1461 reflog_msg = "commit (merge)";
1462 pptr = &commit_list_insert(current_head, pptr)->next;
1463 fp = fopen(git_path("MERGE_HEAD"), "r");
1465 die_errno(_("could not open '%s' for reading"),
1466 git_path("MERGE_HEAD"));
1467 while (strbuf_getline(&m, fp, '\n') != EOF) {
1468 struct commit *parent;
1470 parent = get_merge_parent(m.buf);
1472 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1473 pptr = &commit_list_insert(parent, pptr)->next;
1477 if (!stat(git_path("MERGE_MODE"), &statbuf)) {
1478 if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1479 die_errno(_("could not read MERGE_MODE"));
1480 if (!strcmp(sb.buf, "no-ff"))
1481 allow_fast_forward = 0;
1483 if (allow_fast_forward)
1484 parents = reduce_heads(parents);
1487 reflog_msg = (whence == FROM_CHERRY_PICK)
1488 ? "commit (cherry-pick)"
1490 pptr = &commit_list_insert(current_head, pptr)->next;
1493 /* Finally, get the commit message */
1495 if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1496 int saved_errno = errno;
1497 rollback_index_files();
1498 die(_("could not read commit message: %s"), strerror(saved_errno));
1501 /* Truncate the message just before the diff, if any. */
1503 p = strstr(sb.buf, "\ndiff --git ");
1505 strbuf_setlen(&sb, p - sb.buf + 1);
1508 if (cleanup_mode != CLEANUP_NONE)
1509 stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1510 if (template_untouched(&sb) && !allow_empty_message) {
1511 rollback_index_files();
1512 fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
1515 if (message_is_empty(&sb) && !allow_empty_message) {
1516 rollback_index_files();
1517 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
1522 const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1523 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1525 struct commit_extra_header **tail = &extra;
1526 append_merge_tag_headers(parents, &tail);
1529 if (commit_tree_extended(&sb, active_cache_tree->sha1, parents, sha1,
1530 author_ident.buf, sign_commit, extra)) {
1531 rollback_index_files();
1532 die(_("failed to write commit object"));
1534 strbuf_release(&author_ident);
1535 free_commit_extra_headers(extra);
1537 ref_lock = lock_any_ref_for_update("HEAD",
1540 : current_head->object.sha1,
1543 nl = strchr(sb.buf, '\n');
1545 strbuf_setlen(&sb, nl + 1 - sb.buf);
1547 strbuf_addch(&sb, '\n');
1548 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1549 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1552 rollback_index_files();
1553 die(_("cannot lock HEAD ref"));
1555 if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1556 rollback_index_files();
1557 die(_("cannot update HEAD ref"));
1560 unlink(git_path("CHERRY_PICK_HEAD"));
1561 unlink(git_path("REVERT_HEAD"));
1562 unlink(git_path("MERGE_HEAD"));
1563 unlink(git_path("MERGE_MSG"));
1564 unlink(git_path("MERGE_MODE"));
1565 unlink(git_path("SQUASH_MSG"));
1567 if (commit_index_files())
1568 die (_("Repository has been updated, but unable to write\n"
1569 "new_index file. Check that disk is not full or quota is\n"
1570 "not exceeded, and then \"git reset HEAD\" to recover."));
1573 run_hook(get_index_file(), "post-commit", NULL);
1574 if (amend && !no_post_rewrite) {
1575 struct notes_rewrite_cfg *cfg;
1576 cfg = init_copy_notes_for_rewrite("amend");
1578 /* we are amending, so current_head is not NULL */
1579 copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1580 finish_copy_notes_for_rewrite(cfg);
1582 run_rewrite_hook(current_head->object.sha1, sha1);
1585 print_summary(prefix, sha1, !current_head);