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"
30 static const char * const builtin_commit_usage[] = {
31 "git commit [options] [--] <filepattern>...",
35 static const char * const builtin_status_usage[] = {
36 "git status [options] [--] <filepattern>...",
40 static const char implicit_ident_advice[] =
41 N_("Your name and email address were configured automatically based\n"
42 "on your username and hostname. Please check that they are accurate.\n"
43 "You can suppress this message by setting them explicitly:\n"
45 " git config --global user.name \"Your Name\"\n"
46 " git config --global user.email you@example.com\n"
48 "After doing this, you may fix the identity used for this commit with:\n"
50 " git commit --amend --reset-author\n");
52 static const char empty_amend_advice[] =
53 N_("You asked to amend the most recent commit, but doing so would make\n"
54 "it empty. You can repeat your command with --allow-empty, or you can\n"
55 "remove the commit entirely with \"git reset HEAD^\".\n");
57 static const char empty_cherry_pick_advice[] =
58 N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
59 "If you wish to commit it anyway, use:\n"
61 " git commit --allow-empty\n"
63 "Otherwise, please use 'git reset'\n");
65 static unsigned char head_sha1[20];
67 static const char *use_message_buffer;
68 static const char commit_editmsg[] = "COMMIT_EDITMSG";
69 static struct lock_file index_lock; /* real index */
70 static struct lock_file false_lock; /* used only for partial commits */
77 static const char *logfile, *force_author;
78 static const char *template_file;
80 * The _message variables are commit names from which to take
81 * the commit message and/or authorship.
83 static const char *author_message, *author_message_buffer;
84 static char *edit_message, *use_message;
85 static char *fixup_message, *squash_message;
86 static int all, edit_flag, also, interactive, patch_interactive, only, amend, signoff;
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;
91 * The default commit message cleanup mode will remove the lines
92 * beginning with # (shell comments) and leading and trailing
93 * whitespaces (empty lines or containing only whitespaces)
94 * if editor is used, and only the whitespaces if the message
95 * is specified explicitly.
102 static char *cleanup_arg;
104 static enum commit_whence whence;
105 static int use_editor = 1, initial_commit, include_status = 1;
106 static int show_ignored_in_status;
107 static const char *only_include_assumed;
108 static struct strbuf message;
110 static int null_termination;
114 STATUS_FORMAT_PORCELAIN
115 } status_format = STATUS_FORMAT_LONG;
116 static int status_show_branch;
118 static int opt_parse_m(const struct option *opt, const char *arg, int unset)
120 struct strbuf *buf = opt->value;
122 strbuf_setlen(buf, 0);
124 strbuf_addstr(buf, arg);
125 strbuf_addstr(buf, "\n\n");
130 static struct option builtin_commit_options[] = {
131 OPT__QUIET(&quiet, "suppress summary after successful commit"),
132 OPT__VERBOSE(&verbose, "show diff in commit message template"),
134 OPT_GROUP("Commit message options"),
135 OPT_FILENAME('F', "file", &logfile, "read message from file"),
136 OPT_STRING(0, "author", &force_author, "author", "override author for commit"),
137 OPT_STRING(0, "date", &force_date, "date", "override date for commit"),
138 OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m),
139 OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"),
140 OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"),
141 OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"),
142 OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"),
143 OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C-c/--amend)"),
144 OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
145 OPT_FILENAME('t', "template", &template_file, "use specified template file"),
146 OPT_BOOLEAN('e', "edit", &edit_flag, "force edit of commit"),
147 OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
148 OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
149 /* end commit message options */
151 OPT_GROUP("Commit contents options"),
152 OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
153 OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
154 OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
155 OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"),
156 OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
157 OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
158 OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
159 OPT_SET_INT(0, "short", &status_format, "show status concisely",
160 STATUS_FORMAT_SHORT),
161 OPT_BOOLEAN(0, "branch", &status_show_branch, "show branch information"),
162 OPT_SET_INT(0, "porcelain", &status_format,
163 "machine-readable output", STATUS_FORMAT_PORCELAIN),
164 OPT_BOOLEAN('z', "null", &null_termination,
165 "terminate entries with NUL"),
166 OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
167 OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
168 { 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" },
169 /* end commit contents options */
171 { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
172 "ok to record an empty change",
173 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
174 { OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
175 "ok to record a change with an empty message",
176 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
181 static void determine_whence(struct wt_status *s)
183 if (file_exists(git_path("MERGE_HEAD")))
185 else if (file_exists(git_path("CHERRY_PICK_HEAD")))
186 whence = FROM_CHERRY_PICK;
188 whence = FROM_COMMIT;
193 static const char *whence_s(void)
203 case FROM_CHERRY_PICK:
211 static void rollback_index_files(void)
213 switch (commit_style) {
215 break; /* nothing to do */
217 rollback_lock_file(&index_lock);
220 rollback_lock_file(&index_lock);
221 rollback_lock_file(&false_lock);
226 static int commit_index_files(void)
230 switch (commit_style) {
232 break; /* nothing to do */
234 err = commit_lock_file(&index_lock);
237 err = commit_lock_file(&index_lock);
238 rollback_lock_file(&false_lock);
246 * Take a union of paths in the index and the named tree (typically, "HEAD"),
247 * and return the paths that match the given pattern in list.
249 static int list_paths(struct string_list *list, const char *with_tree,
250 const char *prefix, const char **pattern)
255 for (i = 0; pattern[i]; i++)
260 overlay_tree_on_cache(with_tree, prefix);
262 for (i = 0; i < active_nr; i++) {
263 struct cache_entry *ce = active_cache[i];
264 struct string_list_item *item;
266 if (ce->ce_flags & CE_UPDATE)
268 if (!match_pathspec(pattern, ce->name, ce_namelen(ce), 0, m))
270 item = string_list_insert(list, ce->name);
271 if (ce_skip_worktree(ce))
272 item->util = item; /* better a valid pointer than a fake one */
275 return report_path_error(m, pattern, prefix ? strlen(prefix) : 0);
278 static void add_remove_files(struct string_list *list)
281 for (i = 0; i < list->nr; i++) {
283 struct string_list_item *p = &(list->items[i]);
285 /* p->util is skip-worktree */
289 if (!lstat(p->string, &st)) {
290 if (add_to_cache(p->string, &st, 0))
291 die(_("updating files failed"));
293 remove_file_from_cache(p->string);
297 static void create_base_index(void)
300 struct unpack_trees_options opts;
303 if (initial_commit) {
308 memset(&opts, 0, sizeof(opts));
312 opts.src_index = &the_index;
313 opts.dst_index = &the_index;
315 opts.fn = oneway_merge;
316 tree = parse_tree_indirect(head_sha1);
318 die(_("failed to unpack HEAD tree object"));
320 init_tree_desc(&t, tree->buffer, tree->size);
321 if (unpack_trees(1, &t, &opts))
322 exit(128); /* We've already reported the error, finish dying */
325 static void refresh_cache_or_die(int refresh_flags)
328 * refresh_flags contains REFRESH_QUIET, so the only errors
329 * are for unmerged entries.
331 if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
332 die_resolve_conflict("commit");
335 static char *prepare_index(int argc, const char **argv, const char *prefix, int is_status)
338 struct string_list partial;
339 const char **pathspec = NULL;
340 char *old_index_env = NULL;
341 int refresh_flags = REFRESH_QUIET;
344 refresh_flags |= REFRESH_UNMERGED;
347 pathspec = get_pathspec(prefix, argv);
349 if (read_cache_preload(pathspec) < 0)
350 die(_("index file corrupt"));
353 fd = hold_locked_index(&index_lock, 1);
355 refresh_cache_or_die(refresh_flags);
357 if (write_cache(fd, active_cache, active_nr) ||
358 close_lock_file(&index_lock))
359 die(_("unable to create temporary index"));
361 old_index_env = getenv(INDEX_ENVIRONMENT);
362 setenv(INDEX_ENVIRONMENT, index_lock.filename, 1);
364 if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
365 die(_("interactive add failed"));
367 if (old_index_env && *old_index_env)
368 setenv(INDEX_ENVIRONMENT, old_index_env, 1);
370 unsetenv(INDEX_ENVIRONMENT);
373 read_cache_from(index_lock.filename);
375 commit_style = COMMIT_NORMAL;
376 return index_lock.filename;
380 * Non partial, non as-is commit.
382 * (1) get the real index;
383 * (2) update the_index as necessary;
384 * (3) write the_index out to the real index (still locked);
385 * (4) return the name of the locked index file.
387 * The caller should run hooks on the locked real index, and
388 * (A) if all goes well, commit the real index;
389 * (B) on failure, rollback the real index.
391 if (all || (also && pathspec && *pathspec)) {
392 fd = hold_locked_index(&index_lock, 1);
393 add_files_to_cache(also ? prefix : NULL, pathspec, 0);
394 refresh_cache_or_die(refresh_flags);
395 if (write_cache(fd, active_cache, active_nr) ||
396 close_lock_file(&index_lock))
397 die(_("unable to write new_index file"));
398 commit_style = COMMIT_NORMAL;
399 return index_lock.filename;
405 * (1) return the name of the real index file.
407 * The caller should run hooks on the real index,
408 * and create commit from the_index.
409 * We still need to refresh the index here.
411 if (!pathspec || !*pathspec) {
412 fd = hold_locked_index(&index_lock, 1);
413 refresh_cache_or_die(refresh_flags);
414 if (active_cache_changed) {
415 if (write_cache(fd, active_cache, active_nr) ||
416 commit_locked_index(&index_lock))
417 die(_("unable to write new_index file"));
419 rollback_lock_file(&index_lock);
421 commit_style = COMMIT_AS_IS;
422 return get_index_file();
428 * (0) find the set of affected paths;
429 * (1) get lock on the real index file;
430 * (2) update the_index with the given paths;
431 * (3) write the_index out to the real index (still locked);
432 * (4) get lock on the false index file;
433 * (5) reset the_index from HEAD;
434 * (6) update the_index the same way as (2);
435 * (7) write the_index out to the false index file;
436 * (8) return the name of the false index file (still locked);
438 * The caller should run hooks on the locked false index, and
439 * create commit from it. Then
440 * (A) if all goes well, commit the real index;
441 * (B) on failure, rollback the real index;
442 * In either case, rollback the false index.
444 commit_style = COMMIT_PARTIAL;
446 if (whence != FROM_COMMIT)
447 die(_("cannot do a partial commit during a %s."), whence_s());
449 memset(&partial, 0, sizeof(partial));
450 partial.strdup_strings = 1;
451 if (list_paths(&partial, initial_commit ? NULL : "HEAD", prefix, pathspec))
455 if (read_cache() < 0)
456 die(_("cannot read the index"));
458 fd = hold_locked_index(&index_lock, 1);
459 add_remove_files(&partial);
460 refresh_cache(REFRESH_QUIET);
461 if (write_cache(fd, active_cache, active_nr) ||
462 close_lock_file(&index_lock))
463 die(_("unable to write new_index file"));
465 fd = hold_lock_file_for_update(&false_lock,
466 git_path("next-index-%"PRIuMAX,
467 (uintmax_t) getpid()),
471 add_remove_files(&partial);
472 refresh_cache(REFRESH_QUIET);
474 if (write_cache(fd, active_cache, active_nr) ||
475 close_lock_file(&false_lock))
476 die(_("unable to write temporary index file"));
479 read_cache_from(false_lock.filename);
481 return false_lock.filename;
484 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
487 unsigned char sha1[20];
489 if (s->relative_paths)
494 s->reference = "HEAD^1";
496 s->verbose = verbose;
497 s->index_file = index_file;
500 s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
502 wt_status_collect(s);
504 switch (status_format) {
505 case STATUS_FORMAT_SHORT:
506 wt_shortstatus_print(s, null_termination, status_show_branch);
508 case STATUS_FORMAT_PORCELAIN:
509 wt_porcelain_print(s, null_termination);
511 case STATUS_FORMAT_LONG:
516 return s->commitable;
519 static int is_a_merge(const unsigned char *sha1)
521 struct commit *commit = lookup_commit(sha1);
522 if (!commit || parse_commit(commit))
523 die(_("could not parse HEAD commit"));
524 return !!(commit->parents && commit->parents->next);
527 static const char sign_off_header[] = "Signed-off-by: ";
529 static void determine_author_info(struct strbuf *author_ident)
531 char *name, *email, *date;
533 name = getenv("GIT_AUTHOR_NAME");
534 email = getenv("GIT_AUTHOR_EMAIL");
535 date = getenv("GIT_AUTHOR_DATE");
537 if (author_message) {
538 const char *a, *lb, *rb, *eol;
540 a = strstr(author_message_buffer, "\nauthor ");
542 die(_("invalid commit: %s"), author_message);
544 lb = strchrnul(a + strlen("\nauthor "), '<');
545 rb = strchrnul(lb, '>');
546 eol = strchrnul(rb, '\n');
547 if (!*lb || !*rb || !*eol)
548 die(_("invalid commit: %s"), author_message);
550 if (lb == a + strlen("\nauthor "))
551 /* \nauthor <foo@example.com> */
552 name = xcalloc(1, 1);
554 name = xmemdupz(a + strlen("\nauthor "),
556 (a + strlen("\nauthor "))));
557 email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
558 date = xmemdupz(rb + strlen("> "), eol - (rb + strlen("> ")));
562 const char *lb = strstr(force_author, " <");
563 const char *rb = strchr(force_author, '>');
566 die(_("malformed --author parameter"));
567 name = xstrndup(force_author, lb - force_author);
568 email = xstrndup(lb + 2, rb - (lb + 2));
573 strbuf_addstr(author_ident, fmt_ident(name, email, date,
574 IDENT_ERROR_ON_NO_NAME));
577 static int ends_rfc2822_footer(struct strbuf *sb)
584 const char *buf = sb->buf;
586 for (i = len - 1; i > 0; i--) {
587 if (hit && buf[i] == '\n')
589 hit = (buf[i] == '\n');
592 while (i < len - 1 && buf[i] == '\n')
595 for (; i < len; i = k) {
596 for (k = i; k < len && buf[k] != '\n'; k++)
600 if ((buf[k] == ' ' || buf[k] == '\t') && !first)
605 for (j = 0; i + j < len; j++) {
618 static char *cut_ident_timestamp_part(char *string)
620 char *ket = strrchr(string, '>');
621 if (!ket || ket[1] != ' ')
622 die(_("Malformed ident string: '%s'"), string);
627 static int prepare_to_commit(const char *index_file, const char *prefix,
629 struct strbuf *author_ident)
632 struct strbuf committer_ident = STRBUF_INIT;
633 int commitable, saved_color_setting;
634 struct strbuf sb = STRBUF_INIT;
636 const char *hook_arg1 = NULL;
637 const char *hook_arg2 = NULL;
640 if (!no_verify && run_hook(index_file, "pre-commit", NULL))
643 if (squash_message) {
645 * Insert the proper subject line before other commit
646 * message options add their content.
648 if (use_message && !strcmp(use_message, squash_message))
649 strbuf_addstr(&sb, "squash! ");
651 struct pretty_print_context ctx = {0};
653 c = lookup_commit_reference_by_name(squash_message);
655 die(_("could not lookup commit %s"), squash_message);
656 ctx.output_encoding = get_commit_output_encoding();
657 format_commit_message(c, "squash! %s\n\n", &sb,
663 strbuf_addbuf(&sb, &message);
664 hook_arg1 = "message";
665 } else if (logfile && !strcmp(logfile, "-")) {
667 fprintf(stderr, _("(reading log message from standard input)\n"));
668 if (strbuf_read(&sb, 0, 0) < 0)
669 die_errno(_("could not read log from standard input"));
670 hook_arg1 = "message";
671 } else if (logfile) {
672 if (strbuf_read_file(&sb, logfile, 0) < 0)
673 die_errno(_("could not read log file '%s'"),
675 hook_arg1 = "message";
676 } else if (use_message) {
677 buffer = strstr(use_message_buffer, "\n\n");
678 if (!buffer || buffer[2] == '\0')
679 die(_("commit has empty message"));
680 strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
681 hook_arg1 = "commit";
682 hook_arg2 = use_message;
683 } else if (fixup_message) {
684 struct pretty_print_context ctx = {0};
685 struct commit *commit;
686 commit = lookup_commit_reference_by_name(fixup_message);
688 die(_("could not lookup commit %s"), fixup_message);
689 ctx.output_encoding = get_commit_output_encoding();
690 format_commit_message(commit, "fixup! %s\n\n",
692 hook_arg1 = "message";
693 } else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
694 if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
695 die_errno(_("could not read MERGE_MSG"));
697 } else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
698 if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
699 die_errno(_("could not read SQUASH_MSG"));
700 hook_arg1 = "squash";
701 } else if (template_file) {
702 if (strbuf_read_file(&sb, template_file, 0) < 0)
703 die_errno(_("could not read '%s'"), template_file);
704 hook_arg1 = "template";
708 * The remaining cases don't modify the template message, but
709 * just set the argument(s) to the prepare-commit-msg hook.
711 else if (whence == FROM_MERGE)
713 else if (whence == FROM_CHERRY_PICK) {
714 hook_arg1 = "commit";
715 hook_arg2 = "CHERRY_PICK_HEAD";
718 if (squash_message) {
720 * If squash_commit was used for the commit subject,
721 * then we're possibly hijacking other commit log options.
722 * Reset the hook args to tell the real story.
724 hook_arg1 = "message";
728 s->fp = fopen(git_path(commit_editmsg), "w");
730 die_errno(_("could not open '%s'"), git_path(commit_editmsg));
732 if (cleanup_mode != CLEANUP_NONE)
736 struct strbuf sob = STRBUF_INIT;
739 strbuf_addstr(&sob, sign_off_header);
740 strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
741 getenv("GIT_COMMITTER_EMAIL")));
742 strbuf_addch(&sob, '\n');
743 for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
745 if (prefixcmp(sb.buf + i, sob.buf)) {
746 if (!i || !ends_rfc2822_footer(&sb))
747 strbuf_addch(&sb, '\n');
748 strbuf_addbuf(&sb, &sob);
750 strbuf_release(&sob);
753 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
754 die_errno(_("could not write commit template"));
758 /* This checks and barfs if author is badly specified */
759 determine_author_info(author_ident);
761 /* This checks if committer ident is explicitly given */
762 strbuf_addstr(&committer_ident, git_committer_info(0));
763 if (use_editor && include_status) {
764 char *ai_tmp, *ci_tmp;
765 if (whence != FROM_COMMIT)
766 status_printf_ln(s, GIT_COLOR_NORMAL,
768 "It looks like you may be committing a %s.\n"
769 "If this is not correct, please remove the file\n"
774 git_path(whence == FROM_MERGE
776 : "CHERRY_PICK_HEAD"));
778 fprintf(s->fp, "\n");
779 status_printf(s, GIT_COLOR_NORMAL,
780 _("Please enter the commit message for your changes."));
781 if (cleanup_mode == CLEANUP_ALL)
782 status_printf_more(s, GIT_COLOR_NORMAL,
783 _(" Lines starting\n"
784 "with '#' will be ignored, and an empty"
785 " message aborts the commit.\n"));
786 else /* CLEANUP_SPACE, that is. */
787 status_printf_more(s, GIT_COLOR_NORMAL,
788 _(" Lines starting\n"
789 "with '#' will be kept; you may remove them"
790 " yourself if you want to.\n"
791 "An empty message aborts the commit.\n"));
792 if (only_include_assumed)
793 status_printf_ln(s, GIT_COLOR_NORMAL,
794 "%s", only_include_assumed);
796 ai_tmp = cut_ident_timestamp_part(author_ident->buf);
797 ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
798 if (strcmp(author_ident->buf, committer_ident.buf))
799 status_printf_ln(s, GIT_COLOR_NORMAL,
802 ident_shown++ ? "" : "\n",
805 if (!user_ident_sufficiently_given())
806 status_printf_ln(s, GIT_COLOR_NORMAL,
809 ident_shown++ ? "" : "\n",
810 committer_ident.buf);
813 status_printf_ln(s, GIT_COLOR_NORMAL, "");
815 saved_color_setting = s->use_color;
817 commitable = run_status(s->fp, index_file, prefix, 1, s);
818 s->use_color = saved_color_setting;
823 unsigned char sha1[20];
824 const char *parent = "HEAD";
826 if (!active_nr && read_cache() < 0)
827 die(_("Cannot read index"));
832 if (get_sha1(parent, sha1))
833 commitable = !!active_nr;
835 commitable = index_differs_from(parent, 0);
837 strbuf_release(&committer_ident);
842 * Reject an attempt to record a non-merge empty commit without
843 * explicit --allow-empty. In the cherry-pick case, it may be
844 * empty due to conflict resolution, which the user should okay.
846 if (!commitable && whence != FROM_MERGE && !allow_empty &&
847 !(amend && is_a_merge(head_sha1))) {
848 run_status(stdout, index_file, prefix, 0, s);
850 fputs(_(empty_amend_advice), stderr);
851 else if (whence == FROM_CHERRY_PICK)
852 fputs(_(empty_cherry_pick_advice), stderr);
857 * Re-read the index as pre-commit hook could have updated it,
858 * and write it out as a tree. We must do this before we invoke
859 * the editor and after we invoke run_status above.
862 read_cache_from(index_file);
863 if (!active_cache_tree)
864 active_cache_tree = cache_tree();
865 if (cache_tree_update(active_cache_tree,
866 active_cache, active_nr, 0, 0) < 0) {
867 error(_("Error building trees"));
871 if (run_hook(index_file, "prepare-commit-msg",
872 git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
876 char index[PATH_MAX];
877 const char *env[2] = { NULL };
879 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
880 if (launch_editor(git_path(commit_editmsg), NULL, env)) {
882 _("Please supply the message using either -m or -F option.\n"));
888 run_hook(index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
896 * Find out if the message in the strbuf contains only whitespace and
897 * Signed-off-by lines.
899 static int message_is_empty(struct strbuf *sb)
901 struct strbuf tmpl = STRBUF_INIT;
903 int eol, i, start = 0;
905 if (cleanup_mode == CLEANUP_NONE && sb->len)
908 /* See if the template is just a prefix of the message. */
909 if (template_file && strbuf_read_file(&tmpl, template_file, 0) > 0) {
910 stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
911 if (start + tmpl.len <= sb->len &&
912 memcmp(tmpl.buf, sb->buf + start, tmpl.len) == 0)
915 strbuf_release(&tmpl);
917 /* Check if the rest is just whitespace and Signed-of-by's. */
918 for (i = start; i < sb->len; i++) {
919 nl = memchr(sb->buf + i, '\n', sb->len - i);
925 if (strlen(sign_off_header) <= eol - i &&
926 !prefixcmp(sb->buf + i, sign_off_header)) {
931 if (!isspace(sb->buf[i++]))
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;
946 init_revisions(&revs, NULL);
947 strbuf_addf(&buf, "--author=%s", name);
952 setup_revisions(ac, av, &revs, NULL);
953 prepare_revision_walk(&revs);
954 commit = get_revision(&revs);
956 struct pretty_print_context ctx = {0};
957 ctx.date_mode = DATE_NORMAL;
958 strbuf_release(&buf);
959 format_commit_message(commit, "%an <%ae>", &buf, &ctx);
960 return strbuf_detach(&buf, NULL);
962 die(_("No existing author found with '%s'"), name);
966 static void handle_untracked_files_arg(struct wt_status *s)
968 if (!untracked_files_arg)
969 ; /* default already initialized */
970 else if (!strcmp(untracked_files_arg, "no"))
971 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
972 else if (!strcmp(untracked_files_arg, "normal"))
973 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
974 else if (!strcmp(untracked_files_arg, "all"))
975 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
977 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
980 static const char *read_commit_message(const char *name)
982 const char *out_enc, *out;
983 struct commit *commit;
985 commit = lookup_commit_reference_by_name(name);
987 die(_("could not lookup commit %s"), name);
988 out_enc = get_commit_output_encoding();
989 out = logmsg_reencode(commit, out_enc);
992 * If we failed to reencode the buffer, just copy it
993 * byte for byte so the user can try to fix it up.
994 * This also handles the case where input and output
995 * encodings are identical.
998 out = xstrdup(commit->buffer);
1002 static int parse_and_validate_options(int argc, const char *argv[],
1003 const char * const usage[],
1005 struct wt_status *s)
1009 argc = parse_options(argc, argv, prefix, builtin_commit_options, usage,
1012 if (force_author && !strchr(force_author, '>'))
1013 force_author = find_author_by_nickname(force_author);
1015 if (force_author && renew_authorship)
1016 die(_("Using both --reset-author and --author does not make sense"));
1018 if (logfile || message.len || use_message || fixup_message)
1023 setenv("GIT_EDITOR", ":", 1);
1025 if (get_sha1("HEAD", head_sha1))
1028 /* Sanity check options */
1029 if (amend && initial_commit)
1030 die(_("You have nothing to amend."));
1031 if (amend && whence != FROM_COMMIT)
1032 die(_("You are in the middle of a %s -- cannot amend."), whence_s());
1033 if (fixup_message && squash_message)
1034 die(_("Options --squash and --fixup cannot be used together"));
1044 die(_("Only one of -c/-C/-F/--fixup can be used."));
1045 if (message.len && f > 0)
1046 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1048 use_message = edit_message;
1049 if (amend && !use_message && !fixup_message)
1050 use_message = "HEAD";
1051 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1052 die(_("--reset-author can be used only with -C, -c or --amend."));
1054 use_message_buffer = read_commit_message(use_message);
1055 if (!renew_authorship) {
1056 author_message = use_message;
1057 author_message_buffer = use_message_buffer;
1060 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1061 author_message = "CHERRY_PICK_HEAD";
1062 author_message_buffer = read_commit_message(author_message);
1065 if (patch_interactive)
1068 if (!!also + !!only + !!all + !!interactive > 1)
1069 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
1070 if (argc == 0 && (also || (only && !amend)))
1071 die(_("No paths with --include/--only does not make sense."));
1072 if (argc == 0 && only && amend)
1073 only_include_assumed = _("Clever... amending the last one with dirty index.");
1074 if (argc > 0 && !also && !only)
1075 only_include_assumed = _("Explicit paths specified without -i nor -o; assuming --only paths...");
1076 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1077 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1078 else if (!strcmp(cleanup_arg, "verbatim"))
1079 cleanup_mode = CLEANUP_NONE;
1080 else if (!strcmp(cleanup_arg, "whitespace"))
1081 cleanup_mode = CLEANUP_SPACE;
1082 else if (!strcmp(cleanup_arg, "strip"))
1083 cleanup_mode = CLEANUP_ALL;
1085 die(_("Invalid cleanup mode %s"), cleanup_arg);
1087 handle_untracked_files_arg(s);
1089 if (all && argc > 0)
1090 die(_("Paths with -a does not make sense."));
1092 if (null_termination && status_format == STATUS_FORMAT_LONG)
1093 status_format = STATUS_FORMAT_PORCELAIN;
1094 if (status_format != STATUS_FORMAT_LONG)
1100 static int dry_run_commit(int argc, const char **argv, const char *prefix,
1101 struct wt_status *s)
1104 const char *index_file;
1106 index_file = prepare_index(argc, argv, prefix, 1);
1107 commitable = run_status(stdout, index_file, prefix, 0, s);
1108 rollback_index_files();
1110 return commitable ? 0 : 1;
1113 static int parse_status_slot(const char *var, int offset)
1115 if (!strcasecmp(var+offset, "header"))
1116 return WT_STATUS_HEADER;
1117 if (!strcasecmp(var+offset, "branch"))
1118 return WT_STATUS_ONBRANCH;
1119 if (!strcasecmp(var+offset, "updated")
1120 || !strcasecmp(var+offset, "added"))
1121 return WT_STATUS_UPDATED;
1122 if (!strcasecmp(var+offset, "changed"))
1123 return WT_STATUS_CHANGED;
1124 if (!strcasecmp(var+offset, "untracked"))
1125 return WT_STATUS_UNTRACKED;
1126 if (!strcasecmp(var+offset, "nobranch"))
1127 return WT_STATUS_NOBRANCH;
1128 if (!strcasecmp(var+offset, "unmerged"))
1129 return WT_STATUS_UNMERGED;
1133 static int git_status_config(const char *k, const char *v, void *cb)
1135 struct wt_status *s = cb;
1137 if (!strcmp(k, "status.submodulesummary")) {
1139 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1140 if (is_bool && s->submodule_summary)
1141 s->submodule_summary = -1;
1144 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1145 s->use_color = git_config_colorbool(k, v, -1);
1148 if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
1149 int slot = parse_status_slot(k, 13);
1153 return config_error_nonbool(k);
1154 color_parse(v, k, s->color_palette[slot]);
1157 if (!strcmp(k, "status.relativepaths")) {
1158 s->relative_paths = git_config_bool(k, v);
1161 if (!strcmp(k, "status.showuntrackedfiles")) {
1163 return config_error_nonbool(k);
1164 else if (!strcmp(v, "no"))
1165 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1166 else if (!strcmp(v, "normal"))
1167 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1168 else if (!strcmp(v, "all"))
1169 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1171 return error(_("Invalid untracked files mode '%s'"), v);
1174 return git_diff_ui_config(k, v, NULL);
1177 int cmd_status(int argc, const char **argv, const char *prefix)
1181 unsigned char sha1[20];
1182 static struct option builtin_status_options[] = {
1183 OPT__VERBOSE(&verbose, "be verbose"),
1184 OPT_SET_INT('s', "short", &status_format,
1185 "show status concisely", STATUS_FORMAT_SHORT),
1186 OPT_BOOLEAN('b', "branch", &status_show_branch,
1187 "show branch information"),
1188 OPT_SET_INT(0, "porcelain", &status_format,
1189 "machine-readable output",
1190 STATUS_FORMAT_PORCELAIN),
1191 OPT_BOOLEAN('z', "null", &null_termination,
1192 "terminate entries with NUL"),
1193 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1195 "show untracked files, optional modes: all, normal, no. (Default: all)",
1196 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1197 OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
1198 "show ignored files"),
1199 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when",
1200 "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)",
1201 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1205 if (argc == 2 && !strcmp(argv[1], "-h"))
1206 usage_with_options(builtin_status_usage, builtin_status_options);
1208 if (null_termination && status_format == STATUS_FORMAT_LONG)
1209 status_format = STATUS_FORMAT_PORCELAIN;
1211 wt_status_prepare(&s);
1212 gitmodules_config();
1213 git_config(git_status_config, &s);
1214 determine_whence(&s);
1215 argc = parse_options(argc, argv, prefix,
1216 builtin_status_options,
1217 builtin_status_usage, 0);
1218 handle_untracked_files_arg(&s);
1219 if (show_ignored_in_status)
1220 s.show_ignored_files = 1;
1222 s.pathspec = get_pathspec(prefix, argv);
1224 read_cache_preload(s.pathspec);
1225 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);
1227 fd = hold_locked_index(&index_lock, 0);
1229 update_index_if_able(&the_index, &index_lock);
1231 s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1232 s.ignore_submodule_arg = ignore_submodule_arg;
1233 wt_status_collect(&s);
1235 if (s.relative_paths)
1237 if (s.use_color == -1)
1238 s.use_color = git_use_color_default;
1239 if (diff_use_color_default == -1)
1240 diff_use_color_default = git_use_color_default;
1242 switch (status_format) {
1243 case STATUS_FORMAT_SHORT:
1244 wt_shortstatus_print(&s, null_termination, status_show_branch);
1246 case STATUS_FORMAT_PORCELAIN:
1247 wt_porcelain_print(&s, null_termination);
1249 case STATUS_FORMAT_LONG:
1250 s.verbose = verbose;
1251 s.ignore_submodule_arg = ignore_submodule_arg;
1252 wt_status_print(&s);
1258 static void print_summary(const char *prefix, const unsigned char *sha1)
1260 struct rev_info rev;
1261 struct commit *commit;
1262 struct strbuf format = STRBUF_INIT;
1263 unsigned char junk_sha1[20];
1264 const char *head = resolve_ref("HEAD", junk_sha1, 0, NULL);
1265 struct pretty_print_context pctx = {0};
1266 struct strbuf author_ident = STRBUF_INIT;
1267 struct strbuf committer_ident = STRBUF_INIT;
1269 commit = lookup_commit(sha1);
1271 die(_("couldn't look up newly created commit"));
1272 if (!commit || parse_commit(commit))
1273 die(_("could not parse newly created commit"));
1275 strbuf_addstr(&format, "format:%h] %s");
1277 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1278 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1279 if (strbuf_cmp(&author_ident, &committer_ident)) {
1280 strbuf_addstr(&format, "\n Author: ");
1281 strbuf_addbuf_percentquote(&format, &author_ident);
1283 if (!user_ident_sufficiently_given()) {
1284 strbuf_addstr(&format, "\n Committer: ");
1285 strbuf_addbuf_percentquote(&format, &committer_ident);
1286 if (advice_implicit_identity) {
1287 strbuf_addch(&format, '\n');
1288 strbuf_addstr(&format, _(implicit_ident_advice));
1291 strbuf_release(&author_ident);
1292 strbuf_release(&committer_ident);
1294 init_revisions(&rev, prefix);
1295 setup_revisions(0, NULL, &rev, NULL);
1298 rev.diffopt.output_format =
1299 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1301 rev.verbose_header = 1;
1302 rev.show_root_diff = 1;
1303 get_commit_format(format.buf, &rev);
1304 rev.always_show_header = 0;
1305 rev.diffopt.detect_rename = 1;
1306 rev.diffopt.break_opt = 0;
1307 diff_setup_done(&rev.diffopt);
1310 !prefixcmp(head, "refs/heads/") ?
1312 !strcmp(head, "HEAD") ?
1313 _("detached HEAD") :
1315 initial_commit ? _(" (root-commit)") : "");
1317 if (!log_tree_commit(&rev, commit)) {
1318 rev.always_show_header = 1;
1319 rev.use_terminator = 1;
1320 log_tree_commit(&rev, commit);
1323 strbuf_release(&format);
1326 static int git_commit_config(const char *k, const char *v, void *cb)
1328 struct wt_status *s = cb;
1330 if (!strcmp(k, "commit.template"))
1331 return git_config_pathname(&template_file, k, v);
1332 if (!strcmp(k, "commit.status")) {
1333 include_status = git_config_bool(k, v);
1337 return git_status_config(k, v, s);
1340 static const char post_rewrite_hook[] = "hooks/post-rewrite";
1342 static int run_rewrite_hook(const unsigned char *oldsha1,
1343 const unsigned char *newsha1)
1345 /* oldsha1 SP newsha1 LF NUL */
1346 static char buf[2*40 + 3];
1347 struct child_process proc;
1348 const char *argv[3];
1352 if (access(git_path(post_rewrite_hook), X_OK) < 0)
1355 argv[0] = git_path(post_rewrite_hook);
1359 memset(&proc, 0, sizeof(proc));
1362 proc.stdout_to_stderr = 1;
1364 code = start_command(&proc);
1367 n = snprintf(buf, sizeof(buf), "%s %s\n",
1368 sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
1369 write_in_full(proc.in, buf, n);
1371 return finish_command(&proc);
1374 int cmd_commit(int argc, const char **argv, const char *prefix)
1376 struct strbuf sb = STRBUF_INIT;
1377 struct strbuf author_ident = STRBUF_INIT;
1378 const char *index_file, *reflog_msg;
1380 unsigned char commit_sha1[20];
1381 struct ref_lock *ref_lock;
1382 struct commit_list *parents = NULL, **pptr = &parents;
1383 struct stat statbuf;
1384 int allow_fast_forward = 1;
1387 if (argc == 2 && !strcmp(argv[1], "-h"))
1388 usage_with_options(builtin_commit_usage, builtin_commit_options);
1390 wt_status_prepare(&s);
1391 git_config(git_commit_config, &s);
1392 determine_whence(&s);
1394 if (s.use_color == -1)
1395 s.use_color = git_use_color_default;
1396 argc = parse_and_validate_options(argc, argv, builtin_commit_usage,
1399 if (diff_use_color_default == -1)
1400 diff_use_color_default = git_use_color_default;
1401 return dry_run_commit(argc, argv, prefix, &s);
1403 index_file = prepare_index(argc, argv, prefix, 0);
1405 /* Set up everything for writing the commit object. This includes
1406 running hooks, writing the trees, and interacting with the user. */
1407 if (!prepare_to_commit(index_file, prefix, &s, &author_ident)) {
1408 rollback_index_files();
1412 /* Determine parents */
1413 reflog_msg = getenv("GIT_REFLOG_ACTION");
1414 if (initial_commit) {
1416 reflog_msg = "commit (initial)";
1418 struct commit_list *c;
1419 struct commit *commit;
1422 reflog_msg = "commit (amend)";
1423 commit = lookup_commit(head_sha1);
1424 if (!commit || parse_commit(commit))
1425 die(_("could not parse HEAD commit"));
1427 for (c = commit->parents; c; c = c->next)
1428 pptr = &commit_list_insert(c->item, pptr)->next;
1429 } else if (whence == FROM_MERGE) {
1430 struct strbuf m = STRBUF_INIT;
1434 reflog_msg = "commit (merge)";
1435 pptr = &commit_list_insert(lookup_commit(head_sha1), pptr)->next;
1436 fp = fopen(git_path("MERGE_HEAD"), "r");
1438 die_errno(_("could not open '%s' for reading"),
1439 git_path("MERGE_HEAD"));
1440 while (strbuf_getline(&m, fp, '\n') != EOF) {
1441 unsigned char sha1[20];
1442 if (get_sha1_hex(m.buf, sha1) < 0)
1443 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1444 pptr = &commit_list_insert(lookup_commit(sha1), pptr)->next;
1448 if (!stat(git_path("MERGE_MODE"), &statbuf)) {
1449 if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1450 die_errno(_("could not read MERGE_MODE"));
1451 if (!strcmp(sb.buf, "no-ff"))
1452 allow_fast_forward = 0;
1454 if (allow_fast_forward)
1455 parents = reduce_heads(parents);
1458 reflog_msg = (whence == FROM_CHERRY_PICK)
1459 ? "commit (cherry-pick)"
1461 pptr = &commit_list_insert(lookup_commit(head_sha1), pptr)->next;
1464 /* Finally, get the commit message */
1466 if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1467 int saved_errno = errno;
1468 rollback_index_files();
1469 die(_("could not read commit message: %s"), strerror(saved_errno));
1472 /* Truncate the message just before the diff, if any. */
1474 p = strstr(sb.buf, "\ndiff --git ");
1476 strbuf_setlen(&sb, p - sb.buf + 1);
1479 if (cleanup_mode != CLEANUP_NONE)
1480 stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1481 if (message_is_empty(&sb) && !allow_empty_message) {
1482 rollback_index_files();
1483 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
1487 if (commit_tree(sb.buf, active_cache_tree->sha1, parents, commit_sha1,
1488 author_ident.buf)) {
1489 rollback_index_files();
1490 die(_("failed to write commit object"));
1492 strbuf_release(&author_ident);
1494 ref_lock = lock_any_ref_for_update("HEAD",
1495 initial_commit ? NULL : head_sha1,
1498 nl = strchr(sb.buf, '\n');
1500 strbuf_setlen(&sb, nl + 1 - sb.buf);
1502 strbuf_addch(&sb, '\n');
1503 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1504 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1507 rollback_index_files();
1508 die(_("cannot lock HEAD ref"));
1510 if (write_ref_sha1(ref_lock, commit_sha1, sb.buf) < 0) {
1511 rollback_index_files();
1512 die(_("cannot update HEAD ref"));
1515 unlink(git_path("CHERRY_PICK_HEAD"));
1516 unlink(git_path("MERGE_HEAD"));
1517 unlink(git_path("MERGE_MSG"));
1518 unlink(git_path("MERGE_MODE"));
1519 unlink(git_path("SQUASH_MSG"));
1521 if (commit_index_files())
1522 die (_("Repository has been updated, but unable to write\n"
1523 "new_index file. Check that disk is not full or quota is\n"
1524 "not exceeded, and then \"git reset HEAD\" to recover."));
1527 run_hook(get_index_file(), "post-commit", NULL);
1528 if (amend && !no_post_rewrite) {
1529 struct notes_rewrite_cfg *cfg;
1530 cfg = init_copy_notes_for_rewrite("amend");
1532 copy_note_for_rewrite(cfg, head_sha1, commit_sha1);
1533 finish_copy_notes_for_rewrite(cfg);
1535 run_rewrite_hook(head_sha1, commit_sha1);
1538 print_summary(prefix, commit_sha1);