cache-tree: Write updated cache-tree after commit
[alt-git.git] / builtin / commit.c
blob77570c48ba02adf7aa78654c644b13478246a4e0
1 /*
2 * Builtin "git commit"
4 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
5 * Based on git-commit.sh by Junio C Hamano and Linus Torvalds
6 */
8 #include "cache.h"
9 #include "cache-tree.h"
10 #include "color.h"
11 #include "dir.h"
12 #include "builtin.h"
13 #include "diff.h"
14 #include "diffcore.h"
15 #include "commit.h"
16 #include "revision.h"
17 #include "wt-status.h"
18 #include "run-command.h"
19 #include "refs.h"
20 #include "log-tree.h"
21 #include "strbuf.h"
22 #include "utf8.h"
23 #include "parse-options.h"
24 #include "string-list.h"
25 #include "rerere.h"
26 #include "unpack-trees.h"
27 #include "quote.h"
28 #include "submodule.h"
29 #include "gpg-interface.h"
30 #include "column.h"
31 #include "sequencer.h"
32 #include "notes-utils.h"
33 #include "mailmap.h"
35 static const char * const builtin_commit_usage[] = {
36 N_("git commit [options] [--] <pathspec>..."),
37 NULL
40 static const char * const builtin_status_usage[] = {
41 N_("git status [options] [--] <pathspec>..."),
42 NULL
45 static const char implicit_ident_advice[] =
46 N_("Your name and email address were configured automatically based\n"
47 "on your username and hostname. Please check that they are accurate.\n"
48 "You can suppress this message by setting them explicitly:\n"
49 "\n"
50 " git config --global user.name \"Your Name\"\n"
51 " git config --global user.email you@example.com\n"
52 "\n"
53 "After doing this, you may fix the identity used for this commit with:\n"
54 "\n"
55 " git commit --amend --reset-author\n");
57 static const char empty_amend_advice[] =
58 N_("You asked to amend the most recent commit, but doing so would make\n"
59 "it empty. You can repeat your command with --allow-empty, or you can\n"
60 "remove the commit entirely with \"git reset HEAD^\".\n");
62 static const char empty_cherry_pick_advice[] =
63 N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
64 "If you wish to commit it anyway, use:\n"
65 "\n"
66 " git commit --allow-empty\n"
67 "\n");
69 static const char empty_cherry_pick_advice_single[] =
70 N_("Otherwise, please use 'git reset'\n");
72 static const char empty_cherry_pick_advice_multi[] =
73 N_("If you wish to skip this commit, use:\n"
74 "\n"
75 " git reset\n"
76 "\n"
77 "Then \"git cherry-pick --continue\" will resume cherry-picking\n"
78 "the remaining commits.\n");
80 static const char *use_message_buffer;
81 static const char commit_editmsg[] = "COMMIT_EDITMSG";
82 static struct lock_file index_lock; /* real index */
83 static struct lock_file false_lock; /* used only for partial commits */
84 static enum {
85 COMMIT_AS_IS = 1,
86 COMMIT_NORMAL,
87 COMMIT_PARTIAL
88 } commit_style;
90 static const char *logfile, *force_author;
91 static const char *template_file;
93 * The _message variables are commit names from which to take
94 * the commit message and/or authorship.
96 static const char *author_message, *author_message_buffer;
97 static char *edit_message, *use_message;
98 static char *fixup_message, *squash_message;
99 static int all, also, interactive, patch_interactive, only, amend, signoff;
100 static int edit_flag = -1; /* unspecified */
101 static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
102 static int no_post_rewrite, allow_empty_message;
103 static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
104 static char *sign_commit;
107 * The default commit message cleanup mode will remove the lines
108 * beginning with # (shell comments) and leading and trailing
109 * whitespaces (empty lines or containing only whitespaces)
110 * if editor is used, and only the whitespaces if the message
111 * is specified explicitly.
113 static enum {
114 CLEANUP_SPACE,
115 CLEANUP_NONE,
116 CLEANUP_SCISSORS,
117 CLEANUP_ALL
118 } cleanup_mode;
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,
130 STATUS_FORMAT_LONG,
131 STATUS_FORMAT_SHORT,
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;
140 if (unset) {
141 have_option_m = 0;
142 strbuf_setlen(buf, 0);
143 } else {
144 have_option_m = 1;
145 if (buf->len)
146 strbuf_addch(buf, '\n');
147 strbuf_addstr(buf, arg);
148 strbuf_complete_line(buf);
150 return 0;
153 static void determine_whence(struct wt_status *s)
155 if (file_exists(git_path("MERGE_HEAD")))
156 whence = FROM_MERGE;
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;
162 else
163 whence = FROM_COMMIT;
164 if (s)
165 s->whence = whence;
168 static void status_init_config(struct wt_status *s, config_fn_t fn)
170 wt_status_prepare(s);
171 gitmodules_config();
172 git_config(fn, s);
173 determine_whence(s);
174 s->hints = advice_status_hints; /* must come after git_config() */
177 static void rollback_index_files(void)
179 switch (commit_style) {
180 case COMMIT_AS_IS:
181 break; /* nothing to do */
182 case COMMIT_NORMAL:
183 rollback_lock_file(&index_lock);
184 break;
185 case COMMIT_PARTIAL:
186 rollback_lock_file(&index_lock);
187 rollback_lock_file(&false_lock);
188 break;
192 static int commit_index_files(void)
194 int err = 0;
196 switch (commit_style) {
197 case COMMIT_AS_IS:
198 break; /* nothing to do */
199 case COMMIT_NORMAL:
200 err = commit_lock_file(&index_lock);
201 break;
202 case COMMIT_PARTIAL:
203 err = commit_lock_file(&index_lock);
204 rollback_lock_file(&false_lock);
205 break;
208 return err;
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)
218 int i;
219 char *m;
221 if (!pattern->nr)
222 return 0;
224 m = xcalloc(1, pattern->nr);
226 if (with_tree) {
227 char *max_prefix = common_prefix(pattern);
228 overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
229 free(max_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)
237 continue;
238 if (!ce_path_match(ce, pattern, m))
239 continue;
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)
250 int i;
251 for (i = 0; i < list->nr; i++) {
252 struct stat st;
253 struct string_list_item *p = &(list->items[i]);
255 /* p->util is skip-worktree */
256 if (p->util)
257 continue;
259 if (!lstat(p->string, &st)) {
260 if (add_to_cache(p->string, &st, 0))
261 die(_("updating files failed"));
262 } else
263 remove_file_from_cache(p->string);
267 static void create_base_index(const struct commit *current_head)
269 struct tree *tree;
270 struct unpack_trees_options opts;
271 struct tree_desc t;
273 if (!current_head) {
274 discard_cache();
275 return;
278 memset(&opts, 0, sizeof(opts));
279 opts.head_idx = 1;
280 opts.index_only = 1;
281 opts.merge = 1;
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);
287 if (!tree)
288 die(_("failed to unpack HEAD tree object"));
289 parse_tree(tree);
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)
308 int fd;
309 struct string_list partial;
310 struct pathspec pathspec;
311 int refresh_flags = REFRESH_QUIET;
313 if (is_status)
314 refresh_flags |= REFRESH_UNMERGED;
315 parse_pathspec(&pathspec, 0,
316 PATHSPEC_PREFER_FULL,
317 prefix, argv);
319 if (read_cache_preload(&pathspec) < 0)
320 die(_("index file corrupt"));
322 if (interactive) {
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);
340 else
341 unsetenv(INDEX_ENVIRONMENT);
343 discard_cache();
344 read_cache_from(index_lock.filename);
345 if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) {
346 fd = open(index_lock.filename, O_WRONLY);
347 if (fd >= 0)
348 if (write_cache(fd, active_cache, active_nr) < 0)
349 die(_("unable to write index file"));
350 else
351 close_lock_file(&index_lock);
352 else
353 die(_("unable to write index file"));
354 } else
355 warning(_("Failed to update main cache tree"));
357 commit_style = COMMIT_NORMAL;
358 return index_lock.filename;
362 * Non partial, non as-is commit.
364 * (1) get the real index;
365 * (2) update the_index as necessary;
366 * (3) write the_index out to the real index (still locked);
367 * (4) return the name of the locked index file.
369 * The caller should run hooks on the locked real index, and
370 * (A) if all goes well, commit the real index;
371 * (B) on failure, rollback the real index.
373 if (all || (also && pathspec.nr)) {
374 fd = hold_locked_index(&index_lock, 1);
375 add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
376 refresh_cache_or_die(refresh_flags);
377 update_main_cache_tree(WRITE_TREE_SILENT);
378 if (write_cache(fd, active_cache, active_nr) ||
379 close_lock_file(&index_lock))
380 die(_("unable to write new_index file"));
381 commit_style = COMMIT_NORMAL;
382 return index_lock.filename;
386 * As-is commit.
388 * (1) return the name of the real index file.
390 * The caller should run hooks on the real index,
391 * and create commit from the_index.
392 * We still need to refresh the index here.
394 if (!only && !pathspec.nr) {
395 fd = hold_locked_index(&index_lock, 1);
396 refresh_cache_or_die(refresh_flags);
397 if (active_cache_changed
398 || !cache_tree_fully_valid(active_cache_tree)) {
399 update_main_cache_tree(WRITE_TREE_SILENT);
400 active_cache_changed = 1;
402 if (active_cache_changed) {
403 if (write_cache(fd, active_cache, active_nr) ||
404 commit_locked_index(&index_lock))
405 die(_("unable to write new_index file"));
406 } else {
407 rollback_lock_file(&index_lock);
409 commit_style = COMMIT_AS_IS;
410 return get_index_file();
414 * A partial commit.
416 * (0) find the set of affected paths;
417 * (1) get lock on the real index file;
418 * (2) update the_index with the given paths;
419 * (3) write the_index out to the real index (still locked);
420 * (4) get lock on the false index file;
421 * (5) reset the_index from HEAD;
422 * (6) update the_index the same way as (2);
423 * (7) write the_index out to the false index file;
424 * (8) return the name of the false index file (still locked);
426 * The caller should run hooks on the locked false index, and
427 * create commit from it. Then
428 * (A) if all goes well, commit the real index;
429 * (B) on failure, rollback the real index;
430 * In either case, rollback the false index.
432 commit_style = COMMIT_PARTIAL;
434 if (whence != FROM_COMMIT) {
435 if (whence == FROM_MERGE)
436 die(_("cannot do a partial commit during a merge."));
437 else if (whence == FROM_CHERRY_PICK)
438 die(_("cannot do a partial commit during a cherry-pick."));
441 memset(&partial, 0, sizeof(partial));
442 partial.strdup_strings = 1;
443 if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
444 exit(1);
446 discard_cache();
447 if (read_cache() < 0)
448 die(_("cannot read the index"));
450 fd = hold_locked_index(&index_lock, 1);
451 add_remove_files(&partial);
452 refresh_cache(REFRESH_QUIET);
453 update_main_cache_tree(WRITE_TREE_SILENT);
454 if (write_cache(fd, active_cache, active_nr) ||
455 close_lock_file(&index_lock))
456 die(_("unable to write new_index file"));
458 fd = hold_lock_file_for_update(&false_lock,
459 git_path("next-index-%"PRIuMAX,
460 (uintmax_t) getpid()),
461 LOCK_DIE_ON_ERROR);
463 create_base_index(current_head);
464 add_remove_files(&partial);
465 refresh_cache(REFRESH_QUIET);
467 if (write_cache(fd, active_cache, active_nr) ||
468 close_lock_file(&false_lock))
469 die(_("unable to write temporary index file"));
471 discard_cache();
472 read_cache_from(false_lock.filename);
474 return false_lock.filename;
477 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
478 struct wt_status *s)
480 unsigned char sha1[20];
482 if (s->relative_paths)
483 s->prefix = prefix;
485 if (amend) {
486 s->amend = 1;
487 s->reference = "HEAD^1";
489 s->verbose = verbose;
490 s->index_file = index_file;
491 s->fp = fp;
492 s->nowarn = nowarn;
493 s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
495 wt_status_collect(s);
497 switch (status_format) {
498 case STATUS_FORMAT_SHORT:
499 wt_shortstatus_print(s);
500 break;
501 case STATUS_FORMAT_PORCELAIN:
502 wt_porcelain_print(s);
503 break;
504 case STATUS_FORMAT_UNSPECIFIED:
505 die("BUG: finalize_deferred_config() should have been called");
506 break;
507 case STATUS_FORMAT_NONE:
508 case STATUS_FORMAT_LONG:
509 wt_status_print(s);
510 break;
513 return s->commitable;
516 static int is_a_merge(const struct commit *current_head)
518 return !!(current_head->parents && current_head->parents->next);
521 static void export_one(const char *var, const char *s, const char *e, int hack)
523 struct strbuf buf = STRBUF_INIT;
524 if (hack)
525 strbuf_addch(&buf, hack);
526 strbuf_addf(&buf, "%.*s", (int)(e - s), s);
527 setenv(var, buf.buf, 1);
528 strbuf_release(&buf);
531 static int sane_ident_split(struct ident_split *person)
533 if (!person->name_begin || !person->name_end ||
534 person->name_begin == person->name_end)
535 return 0; /* no human readable name */
536 if (!person->mail_begin || !person->mail_end ||
537 person->mail_begin == person->mail_end)
538 return 0; /* no usable mail */
539 if (!person->date_begin || !person->date_end ||
540 !person->tz_begin || !person->tz_end)
541 return 0;
542 return 1;
545 static void determine_author_info(struct strbuf *author_ident)
547 char *name, *email, *date;
548 struct ident_split author;
550 name = getenv("GIT_AUTHOR_NAME");
551 email = getenv("GIT_AUTHOR_EMAIL");
552 date = getenv("GIT_AUTHOR_DATE");
554 if (author_message) {
555 const char *a, *lb, *rb, *eol;
556 size_t len;
558 a = strstr(author_message_buffer, "\nauthor ");
559 if (!a)
560 die(_("invalid commit: %s"), author_message);
562 lb = strchrnul(a + strlen("\nauthor "), '<');
563 rb = strchrnul(lb, '>');
564 eol = strchrnul(rb, '\n');
565 if (!*lb || !*rb || !*eol)
566 die(_("invalid commit: %s"), author_message);
568 if (lb == a + strlen("\nauthor "))
569 /* \nauthor <foo@example.com> */
570 name = xcalloc(1, 1);
571 else
572 name = xmemdupz(a + strlen("\nauthor "),
573 (lb - strlen(" ") -
574 (a + strlen("\nauthor "))));
575 email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
576 len = eol - (rb + strlen("> "));
577 date = xmalloc(len + 2);
578 *date = '@';
579 memcpy(date + 1, rb + strlen("> "), len);
580 date[len + 1] = '\0';
583 if (force_author) {
584 const char *lb = strstr(force_author, " <");
585 const char *rb = strchr(force_author, '>');
587 if (!lb || !rb)
588 die(_("malformed --author parameter"));
589 name = xstrndup(force_author, lb - force_author);
590 email = xstrndup(lb + 2, rb - (lb + 2));
593 if (force_date)
594 date = force_date;
595 strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
596 if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
597 sane_ident_split(&author)) {
598 export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
599 export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
600 export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
604 static char *cut_ident_timestamp_part(char *string)
606 char *ket = strrchr(string, '>');
607 if (!ket || ket[1] != ' ')
608 die(_("Malformed ident string: '%s'"), string);
609 *++ket = '\0';
610 return ket;
613 static int prepare_to_commit(const char *index_file, const char *prefix,
614 struct commit *current_head,
615 struct wt_status *s,
616 struct strbuf *author_ident)
618 struct stat statbuf;
619 struct strbuf committer_ident = STRBUF_INIT;
620 int commitable;
621 struct strbuf sb = STRBUF_INIT;
622 const char *hook_arg1 = NULL;
623 const char *hook_arg2 = NULL;
624 int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
625 int old_display_comment_prefix;
627 /* This checks and barfs if author is badly specified */
628 determine_author_info(author_ident);
630 if (!no_verify && run_commit_hook(use_editor, index_file, "pre-commit", NULL))
631 return 0;
633 if (squash_message) {
635 * Insert the proper subject line before other commit
636 * message options add their content.
638 if (use_message && !strcmp(use_message, squash_message))
639 strbuf_addstr(&sb, "squash! ");
640 else {
641 struct pretty_print_context ctx = {0};
642 struct commit *c;
643 c = lookup_commit_reference_by_name(squash_message);
644 if (!c)
645 die(_("could not lookup commit %s"), squash_message);
646 ctx.output_encoding = get_commit_output_encoding();
647 format_commit_message(c, "squash! %s\n\n", &sb,
648 &ctx);
652 if (message.len) {
653 strbuf_addbuf(&sb, &message);
654 hook_arg1 = "message";
655 } else if (logfile && !strcmp(logfile, "-")) {
656 if (isatty(0))
657 fprintf(stderr, _("(reading log message from standard input)\n"));
658 if (strbuf_read(&sb, 0, 0) < 0)
659 die_errno(_("could not read log from standard input"));
660 hook_arg1 = "message";
661 } else if (logfile) {
662 if (strbuf_read_file(&sb, logfile, 0) < 0)
663 die_errno(_("could not read log file '%s'"),
664 logfile);
665 hook_arg1 = "message";
666 } else if (use_message) {
667 char *buffer;
668 buffer = strstr(use_message_buffer, "\n\n");
669 if (buffer)
670 strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
671 hook_arg1 = "commit";
672 hook_arg2 = use_message;
673 } else if (fixup_message) {
674 struct pretty_print_context ctx = {0};
675 struct commit *commit;
676 commit = lookup_commit_reference_by_name(fixup_message);
677 if (!commit)
678 die(_("could not lookup commit %s"), fixup_message);
679 ctx.output_encoding = get_commit_output_encoding();
680 format_commit_message(commit, "fixup! %s\n\n",
681 &sb, &ctx);
682 hook_arg1 = "message";
683 } else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
684 if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
685 die_errno(_("could not read MERGE_MSG"));
686 hook_arg1 = "merge";
687 } else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
688 if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
689 die_errno(_("could not read SQUASH_MSG"));
690 hook_arg1 = "squash";
691 } else if (template_file) {
692 if (strbuf_read_file(&sb, template_file, 0) < 0)
693 die_errno(_("could not read '%s'"), template_file);
694 hook_arg1 = "template";
695 clean_message_contents = 0;
699 * The remaining cases don't modify the template message, but
700 * just set the argument(s) to the prepare-commit-msg hook.
702 else if (whence == FROM_MERGE)
703 hook_arg1 = "merge";
704 else if (whence == FROM_CHERRY_PICK) {
705 hook_arg1 = "commit";
706 hook_arg2 = "CHERRY_PICK_HEAD";
709 if (squash_message) {
711 * If squash_commit was used for the commit subject,
712 * then we're possibly hijacking other commit log options.
713 * Reset the hook args to tell the real story.
715 hook_arg1 = "message";
716 hook_arg2 = "";
719 s->fp = fopen(git_path(commit_editmsg), "w");
720 if (s->fp == NULL)
721 die_errno(_("could not open '%s'"), git_path(commit_editmsg));
723 /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
724 old_display_comment_prefix = s->display_comment_prefix;
725 s->display_comment_prefix = 1;
728 * Most hints are counter-productive when the commit has
729 * already started.
731 s->hints = 0;
733 if (clean_message_contents)
734 stripspace(&sb, 0);
736 if (signoff) {
738 * See if we have a Conflicts: block at the end. If yes, count
739 * its size, so we can ignore it.
741 int ignore_footer = 0;
742 int i, eol, previous = 0;
743 const char *nl;
745 for (i = 0; i < sb.len; i++) {
746 nl = memchr(sb.buf + i, '\n', sb.len - i);
747 if (nl)
748 eol = nl - sb.buf;
749 else
750 eol = sb.len;
751 if (starts_with(sb.buf + previous, "\nConflicts:\n")) {
752 ignore_footer = sb.len - previous;
753 break;
755 while (i < eol)
756 i++;
757 previous = eol;
760 append_signoff(&sb, ignore_footer, 0);
763 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
764 die_errno(_("could not write commit template"));
766 strbuf_release(&sb);
768 /* This checks if committer ident is explicitly given */
769 strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
770 if (use_editor && include_status) {
771 int ident_shown = 0;
772 int saved_color_setting;
773 char *ai_tmp, *ci_tmp;
774 if (whence != FROM_COMMIT) {
775 if (cleanup_mode == CLEANUP_SCISSORS)
776 wt_status_add_cut_line(s->fp);
777 status_printf_ln(s, GIT_COLOR_NORMAL,
778 whence == FROM_MERGE
779 ? _("\n"
780 "It looks like you may be committing a merge.\n"
781 "If this is not correct, please remove the file\n"
782 " %s\n"
783 "and try again.\n")
784 : _("\n"
785 "It looks like you may be committing a cherry-pick.\n"
786 "If this is not correct, please remove the file\n"
787 " %s\n"
788 "and try again.\n"),
789 git_path(whence == FROM_MERGE
790 ? "MERGE_HEAD"
791 : "CHERRY_PICK_HEAD"));
794 fprintf(s->fp, "\n");
795 if (cleanup_mode == CLEANUP_ALL)
796 status_printf(s, GIT_COLOR_NORMAL,
797 _("Please enter the commit message for your changes."
798 " Lines starting\nwith '%c' will be ignored, and an empty"
799 " message aborts the commit.\n"), comment_line_char);
800 else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
801 wt_status_add_cut_line(s->fp);
802 else /* CLEANUP_SPACE, that is. */
803 status_printf(s, GIT_COLOR_NORMAL,
804 _("Please enter the commit message for your changes."
805 " Lines starting\n"
806 "with '%c' will be kept; you may remove them"
807 " yourself if you want to.\n"
808 "An empty message aborts the commit.\n"), comment_line_char);
809 if (only_include_assumed)
810 status_printf_ln(s, GIT_COLOR_NORMAL,
811 "%s", only_include_assumed);
813 ai_tmp = cut_ident_timestamp_part(author_ident->buf);
814 ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
815 if (strcmp(author_ident->buf, committer_ident.buf))
816 status_printf_ln(s, GIT_COLOR_NORMAL,
817 _("%s"
818 "Author: %s"),
819 ident_shown++ ? "" : "\n",
820 author_ident->buf);
822 if (!committer_ident_sufficiently_given())
823 status_printf_ln(s, GIT_COLOR_NORMAL,
824 _("%s"
825 "Committer: %s"),
826 ident_shown++ ? "" : "\n",
827 committer_ident.buf);
829 if (ident_shown)
830 status_printf_ln(s, GIT_COLOR_NORMAL, "");
832 saved_color_setting = s->use_color;
833 s->use_color = 0;
834 commitable = run_status(s->fp, index_file, prefix, 1, s);
835 s->use_color = saved_color_setting;
837 *ai_tmp = ' ';
838 *ci_tmp = ' ';
839 } else {
840 unsigned char sha1[20];
841 const char *parent = "HEAD";
843 if (!active_nr && read_cache() < 0)
844 die(_("Cannot read index"));
846 if (amend)
847 parent = "HEAD^1";
849 if (get_sha1(parent, sha1))
850 commitable = !!active_nr;
851 else {
853 * Unless the user did explicitly request a submodule
854 * ignore mode by passing a command line option we do
855 * not ignore any changed submodule SHA-1s when
856 * comparing index and parent, no matter what is
857 * configured. Otherwise we won't commit any
858 * submodules which were manually staged, which would
859 * be really confusing.
861 int diff_flags = DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG;
862 if (ignore_submodule_arg &&
863 !strcmp(ignore_submodule_arg, "all"))
864 diff_flags |= DIFF_OPT_IGNORE_SUBMODULES;
865 commitable = index_differs_from(parent, diff_flags);
868 strbuf_release(&committer_ident);
870 fclose(s->fp);
873 * Reject an attempt to record a non-merge empty commit without
874 * explicit --allow-empty. In the cherry-pick case, it may be
875 * empty due to conflict resolution, which the user should okay.
877 if (!commitable && whence != FROM_MERGE && !allow_empty &&
878 !(amend && is_a_merge(current_head))) {
879 s->display_comment_prefix = old_display_comment_prefix;
880 run_status(stdout, index_file, prefix, 0, s);
881 if (amend)
882 fputs(_(empty_amend_advice), stderr);
883 else if (whence == FROM_CHERRY_PICK) {
884 fputs(_(empty_cherry_pick_advice), stderr);
885 if (!sequencer_in_use)
886 fputs(_(empty_cherry_pick_advice_single), stderr);
887 else
888 fputs(_(empty_cherry_pick_advice_multi), stderr);
890 return 0;
894 * Re-read the index as pre-commit hook could have updated it,
895 * and write it out as a tree. We must do this before we invoke
896 * the editor and after we invoke run_status above.
898 discard_cache();
899 read_cache_from(index_file);
900 if (update_main_cache_tree(0)) {
901 error(_("Error building trees"));
902 return 0;
905 if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
906 git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
907 return 0;
909 if (use_editor) {
910 char index[PATH_MAX];
911 const char *env[2] = { NULL };
912 env[0] = index;
913 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
914 if (launch_editor(git_path(commit_editmsg), NULL, env)) {
915 fprintf(stderr,
916 _("Please supply the message using either -m or -F option.\n"));
917 exit(1);
921 if (!no_verify &&
922 run_commit_hook(use_editor, index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
923 return 0;
926 return 1;
929 static int rest_is_empty(struct strbuf *sb, int start)
931 int i, eol;
932 const char *nl;
934 /* Check if the rest is just whitespace and Signed-of-by's. */
935 for (i = start; i < sb->len; i++) {
936 nl = memchr(sb->buf + i, '\n', sb->len - i);
937 if (nl)
938 eol = nl - sb->buf;
939 else
940 eol = sb->len;
942 if (strlen(sign_off_header) <= eol - i &&
943 starts_with(sb->buf + i, sign_off_header)) {
944 i = eol;
945 continue;
947 while (i < eol)
948 if (!isspace(sb->buf[i++]))
949 return 0;
952 return 1;
956 * Find out if the message in the strbuf contains only whitespace and
957 * Signed-off-by lines.
959 static int message_is_empty(struct strbuf *sb)
961 if (cleanup_mode == CLEANUP_NONE && sb->len)
962 return 0;
963 return rest_is_empty(sb, 0);
967 * See if the user edited the message in the editor or left what
968 * was in the template intact
970 static int template_untouched(struct strbuf *sb)
972 struct strbuf tmpl = STRBUF_INIT;
973 char *start;
975 if (cleanup_mode == CLEANUP_NONE && sb->len)
976 return 0;
978 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
979 return 0;
981 stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
982 start = (char *)skip_prefix(sb->buf, tmpl.buf);
983 if (!start)
984 start = sb->buf;
985 strbuf_release(&tmpl);
986 return rest_is_empty(sb, start - sb->buf);
989 static const char *find_author_by_nickname(const char *name)
991 struct rev_info revs;
992 struct commit *commit;
993 struct strbuf buf = STRBUF_INIT;
994 struct string_list mailmap = STRING_LIST_INIT_NODUP;
995 const char *av[20];
996 int ac = 0;
998 init_revisions(&revs, NULL);
999 strbuf_addf(&buf, "--author=%s", name);
1000 av[++ac] = "--all";
1001 av[++ac] = "-i";
1002 av[++ac] = buf.buf;
1003 av[++ac] = NULL;
1004 setup_revisions(ac, av, &revs, NULL);
1005 revs.mailmap = &mailmap;
1006 read_mailmap(revs.mailmap, NULL);
1008 prepare_revision_walk(&revs);
1009 commit = get_revision(&revs);
1010 if (commit) {
1011 struct pretty_print_context ctx = {0};
1012 ctx.date_mode = DATE_NORMAL;
1013 strbuf_release(&buf);
1014 format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
1015 clear_mailmap(&mailmap);
1016 return strbuf_detach(&buf, NULL);
1018 die(_("No existing author found with '%s'"), name);
1022 static void handle_untracked_files_arg(struct wt_status *s)
1024 if (!untracked_files_arg)
1025 ; /* default already initialized */
1026 else if (!strcmp(untracked_files_arg, "no"))
1027 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1028 else if (!strcmp(untracked_files_arg, "normal"))
1029 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1030 else if (!strcmp(untracked_files_arg, "all"))
1031 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1032 else
1033 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
1036 static const char *read_commit_message(const char *name)
1038 const char *out_enc;
1039 struct commit *commit;
1041 commit = lookup_commit_reference_by_name(name);
1042 if (!commit)
1043 die(_("could not lookup commit %s"), name);
1044 out_enc = get_commit_output_encoding();
1045 return logmsg_reencode(commit, NULL, out_enc);
1049 * Enumerate what needs to be propagated when --porcelain
1050 * is not in effect here.
1052 static struct status_deferred_config {
1053 enum status_format status_format;
1054 int show_branch;
1055 } status_deferred_config = {
1056 STATUS_FORMAT_UNSPECIFIED,
1057 -1 /* unspecified */
1060 static void finalize_deferred_config(struct wt_status *s)
1062 int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
1063 !s->null_termination);
1065 if (s->null_termination) {
1066 if (status_format == STATUS_FORMAT_NONE ||
1067 status_format == STATUS_FORMAT_UNSPECIFIED)
1068 status_format = STATUS_FORMAT_PORCELAIN;
1069 else if (status_format == STATUS_FORMAT_LONG)
1070 die(_("--long and -z are incompatible"));
1073 if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED)
1074 status_format = status_deferred_config.status_format;
1075 if (status_format == STATUS_FORMAT_UNSPECIFIED)
1076 status_format = STATUS_FORMAT_NONE;
1078 if (use_deferred_config && s->show_branch < 0)
1079 s->show_branch = status_deferred_config.show_branch;
1080 if (s->show_branch < 0)
1081 s->show_branch = 0;
1084 static int parse_and_validate_options(int argc, const char *argv[],
1085 const struct option *options,
1086 const char * const usage[],
1087 const char *prefix,
1088 struct commit *current_head,
1089 struct wt_status *s)
1091 int f = 0;
1093 argc = parse_options(argc, argv, prefix, options, usage, 0);
1094 finalize_deferred_config(s);
1096 if (force_author && !strchr(force_author, '>'))
1097 force_author = find_author_by_nickname(force_author);
1099 if (force_author && renew_authorship)
1100 die(_("Using both --reset-author and --author does not make sense"));
1102 if (logfile || have_option_m || use_message || fixup_message)
1103 use_editor = 0;
1104 if (0 <= edit_flag)
1105 use_editor = edit_flag;
1107 /* Sanity check options */
1108 if (amend && !current_head)
1109 die(_("You have nothing to amend."));
1110 if (amend && whence != FROM_COMMIT) {
1111 if (whence == FROM_MERGE)
1112 die(_("You are in the middle of a merge -- cannot amend."));
1113 else if (whence == FROM_CHERRY_PICK)
1114 die(_("You are in the middle of a cherry-pick -- cannot amend."));
1116 if (fixup_message && squash_message)
1117 die(_("Options --squash and --fixup cannot be used together"));
1118 if (use_message)
1119 f++;
1120 if (edit_message)
1121 f++;
1122 if (fixup_message)
1123 f++;
1124 if (logfile)
1125 f++;
1126 if (f > 1)
1127 die(_("Only one of -c/-C/-F/--fixup can be used."));
1128 if (message.len && f > 0)
1129 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1130 if (f || message.len)
1131 template_file = NULL;
1132 if (edit_message)
1133 use_message = edit_message;
1134 if (amend && !use_message && !fixup_message)
1135 use_message = "HEAD";
1136 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1137 die(_("--reset-author can be used only with -C, -c or --amend."));
1138 if (use_message) {
1139 use_message_buffer = read_commit_message(use_message);
1140 if (!renew_authorship) {
1141 author_message = use_message;
1142 author_message_buffer = use_message_buffer;
1145 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1146 author_message = "CHERRY_PICK_HEAD";
1147 author_message_buffer = read_commit_message(author_message);
1150 if (patch_interactive)
1151 interactive = 1;
1153 if (also + only + all + interactive > 1)
1154 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
1155 if (argc == 0 && (also || (only && !amend)))
1156 die(_("No paths with --include/--only does not make sense."));
1157 if (argc == 0 && only && amend)
1158 only_include_assumed = _("Clever... amending the last one with dirty index.");
1159 if (argc > 0 && !also && !only)
1160 only_include_assumed = _("Explicit paths specified without -i or -o; assuming --only paths...");
1161 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1162 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1163 else if (!strcmp(cleanup_arg, "verbatim"))
1164 cleanup_mode = CLEANUP_NONE;
1165 else if (!strcmp(cleanup_arg, "whitespace"))
1166 cleanup_mode = CLEANUP_SPACE;
1167 else if (!strcmp(cleanup_arg, "strip"))
1168 cleanup_mode = CLEANUP_ALL;
1169 else if (!strcmp(cleanup_arg, "scissors"))
1170 cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
1171 else
1172 die(_("Invalid cleanup mode %s"), cleanup_arg);
1174 handle_untracked_files_arg(s);
1176 if (all && argc > 0)
1177 die(_("Paths with -a does not make sense."));
1179 if (status_format != STATUS_FORMAT_NONE)
1180 dry_run = 1;
1182 return argc;
1185 static int dry_run_commit(int argc, const char **argv, const char *prefix,
1186 const struct commit *current_head, struct wt_status *s)
1188 int commitable;
1189 const char *index_file;
1191 index_file = prepare_index(argc, argv, prefix, current_head, 1);
1192 commitable = run_status(stdout, index_file, prefix, 0, s);
1193 rollback_index_files();
1195 return commitable ? 0 : 1;
1198 static int parse_status_slot(const char *var, int offset)
1200 if (!strcasecmp(var+offset, "header"))
1201 return WT_STATUS_HEADER;
1202 if (!strcasecmp(var+offset, "branch"))
1203 return WT_STATUS_ONBRANCH;
1204 if (!strcasecmp(var+offset, "updated")
1205 || !strcasecmp(var+offset, "added"))
1206 return WT_STATUS_UPDATED;
1207 if (!strcasecmp(var+offset, "changed"))
1208 return WT_STATUS_CHANGED;
1209 if (!strcasecmp(var+offset, "untracked"))
1210 return WT_STATUS_UNTRACKED;
1211 if (!strcasecmp(var+offset, "nobranch"))
1212 return WT_STATUS_NOBRANCH;
1213 if (!strcasecmp(var+offset, "unmerged"))
1214 return WT_STATUS_UNMERGED;
1215 return -1;
1218 static int git_status_config(const char *k, const char *v, void *cb)
1220 struct wt_status *s = cb;
1222 if (starts_with(k, "column."))
1223 return git_column_config(k, v, "status", &s->colopts);
1224 if (!strcmp(k, "status.submodulesummary")) {
1225 int is_bool;
1226 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1227 if (is_bool && s->submodule_summary)
1228 s->submodule_summary = -1;
1229 return 0;
1231 if (!strcmp(k, "status.short")) {
1232 if (git_config_bool(k, v))
1233 status_deferred_config.status_format = STATUS_FORMAT_SHORT;
1234 else
1235 status_deferred_config.status_format = STATUS_FORMAT_NONE;
1236 return 0;
1238 if (!strcmp(k, "status.branch")) {
1239 status_deferred_config.show_branch = git_config_bool(k, v);
1240 return 0;
1242 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1243 s->use_color = git_config_colorbool(k, v);
1244 return 0;
1246 if (!strcmp(k, "status.displaycommentprefix")) {
1247 s->display_comment_prefix = git_config_bool(k, v);
1248 return 0;
1250 if (starts_with(k, "status.color.") || starts_with(k, "color.status.")) {
1251 int slot = parse_status_slot(k, 13);
1252 if (slot < 0)
1253 return 0;
1254 if (!v)
1255 return config_error_nonbool(k);
1256 color_parse(v, k, s->color_palette[slot]);
1257 return 0;
1259 if (!strcmp(k, "status.relativepaths")) {
1260 s->relative_paths = git_config_bool(k, v);
1261 return 0;
1263 if (!strcmp(k, "status.showuntrackedfiles")) {
1264 if (!v)
1265 return config_error_nonbool(k);
1266 else if (!strcmp(v, "no"))
1267 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1268 else if (!strcmp(v, "normal"))
1269 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1270 else if (!strcmp(v, "all"))
1271 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1272 else
1273 return error(_("Invalid untracked files mode '%s'"), v);
1274 return 0;
1276 return git_diff_ui_config(k, v, NULL);
1279 int cmd_status(int argc, const char **argv, const char *prefix)
1281 static struct wt_status s;
1282 int fd;
1283 unsigned char sha1[20];
1284 static struct option builtin_status_options[] = {
1285 OPT__VERBOSE(&verbose, N_("be verbose")),
1286 OPT_SET_INT('s', "short", &status_format,
1287 N_("show status concisely"), STATUS_FORMAT_SHORT),
1288 OPT_BOOL('b', "branch", &s.show_branch,
1289 N_("show branch information")),
1290 OPT_SET_INT(0, "porcelain", &status_format,
1291 N_("machine-readable output"),
1292 STATUS_FORMAT_PORCELAIN),
1293 OPT_SET_INT(0, "long", &status_format,
1294 N_("show status in long format (default)"),
1295 STATUS_FORMAT_LONG),
1296 OPT_BOOL('z', "null", &s.null_termination,
1297 N_("terminate entries with NUL")),
1298 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1299 N_("mode"),
1300 N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
1301 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1302 OPT_BOOL(0, "ignored", &show_ignored_in_status,
1303 N_("show ignored files")),
1304 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
1305 N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
1306 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1307 OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
1308 OPT_END(),
1311 if (argc == 2 && !strcmp(argv[1], "-h"))
1312 usage_with_options(builtin_status_usage, builtin_status_options);
1314 status_init_config(&s, git_status_config);
1315 argc = parse_options(argc, argv, prefix,
1316 builtin_status_options,
1317 builtin_status_usage, 0);
1318 finalize_colopts(&s.colopts, -1);
1319 finalize_deferred_config(&s);
1321 handle_untracked_files_arg(&s);
1322 if (show_ignored_in_status)
1323 s.show_ignored_files = 1;
1324 parse_pathspec(&s.pathspec, 0,
1325 PATHSPEC_PREFER_FULL,
1326 prefix, argv);
1328 read_cache_preload(&s.pathspec);
1329 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
1331 fd = hold_locked_index(&index_lock, 0);
1332 if (0 <= fd)
1333 update_index_if_able(&the_index, &index_lock);
1335 s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1336 s.ignore_submodule_arg = ignore_submodule_arg;
1337 wt_status_collect(&s);
1339 if (s.relative_paths)
1340 s.prefix = prefix;
1342 switch (status_format) {
1343 case STATUS_FORMAT_SHORT:
1344 wt_shortstatus_print(&s);
1345 break;
1346 case STATUS_FORMAT_PORCELAIN:
1347 wt_porcelain_print(&s);
1348 break;
1349 case STATUS_FORMAT_UNSPECIFIED:
1350 die("BUG: finalize_deferred_config() should have been called");
1351 break;
1352 case STATUS_FORMAT_NONE:
1353 case STATUS_FORMAT_LONG:
1354 s.verbose = verbose;
1355 s.ignore_submodule_arg = ignore_submodule_arg;
1356 wt_status_print(&s);
1357 break;
1359 return 0;
1362 static void print_summary(const char *prefix, const unsigned char *sha1,
1363 int initial_commit)
1365 struct rev_info rev;
1366 struct commit *commit;
1367 struct strbuf format = STRBUF_INIT;
1368 unsigned char junk_sha1[20];
1369 const char *head;
1370 struct pretty_print_context pctx = {0};
1371 struct strbuf author_ident = STRBUF_INIT;
1372 struct strbuf committer_ident = STRBUF_INIT;
1374 commit = lookup_commit(sha1);
1375 if (!commit)
1376 die(_("couldn't look up newly created commit"));
1377 if (parse_commit(commit))
1378 die(_("could not parse newly created commit"));
1380 strbuf_addstr(&format, "format:%h] %s");
1382 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1383 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1384 if (strbuf_cmp(&author_ident, &committer_ident)) {
1385 strbuf_addstr(&format, "\n Author: ");
1386 strbuf_addbuf_percentquote(&format, &author_ident);
1388 if (!committer_ident_sufficiently_given()) {
1389 strbuf_addstr(&format, "\n Committer: ");
1390 strbuf_addbuf_percentquote(&format, &committer_ident);
1391 if (advice_implicit_identity) {
1392 strbuf_addch(&format, '\n');
1393 strbuf_addstr(&format, _(implicit_ident_advice));
1396 strbuf_release(&author_ident);
1397 strbuf_release(&committer_ident);
1399 init_revisions(&rev, prefix);
1400 setup_revisions(0, NULL, &rev, NULL);
1402 rev.diff = 1;
1403 rev.diffopt.output_format =
1404 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1406 rev.verbose_header = 1;
1407 rev.show_root_diff = 1;
1408 get_commit_format(format.buf, &rev);
1409 rev.always_show_header = 0;
1410 rev.diffopt.detect_rename = 1;
1411 rev.diffopt.break_opt = 0;
1412 diff_setup_done(&rev.diffopt);
1414 head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1415 printf("[%s%s ",
1416 starts_with(head, "refs/heads/") ?
1417 head + 11 :
1418 !strcmp(head, "HEAD") ?
1419 _("detached HEAD") :
1420 head,
1421 initial_commit ? _(" (root-commit)") : "");
1423 if (!log_tree_commit(&rev, commit)) {
1424 rev.always_show_header = 1;
1425 rev.use_terminator = 1;
1426 log_tree_commit(&rev, commit);
1429 strbuf_release(&format);
1432 static int git_commit_config(const char *k, const char *v, void *cb)
1434 struct wt_status *s = cb;
1435 int status;
1437 if (!strcmp(k, "commit.template"))
1438 return git_config_pathname(&template_file, k, v);
1439 if (!strcmp(k, "commit.status")) {
1440 include_status = git_config_bool(k, v);
1441 return 0;
1443 if (!strcmp(k, "commit.cleanup"))
1444 return git_config_string(&cleanup_arg, k, v);
1445 if (!strcmp(k, "commit.gpgsign")) {
1446 sign_commit = git_config_bool(k, v) ? "" : NULL;
1447 return 0;
1450 status = git_gpg_config(k, v, NULL);
1451 if (status)
1452 return status;
1453 return git_status_config(k, v, s);
1456 static int run_rewrite_hook(const unsigned char *oldsha1,
1457 const unsigned char *newsha1)
1459 /* oldsha1 SP newsha1 LF NUL */
1460 static char buf[2*40 + 3];
1461 struct child_process proc;
1462 const char *argv[3];
1463 int code;
1464 size_t n;
1466 argv[0] = find_hook("post-rewrite");
1467 if (!argv[0])
1468 return 0;
1470 argv[1] = "amend";
1471 argv[2] = NULL;
1473 memset(&proc, 0, sizeof(proc));
1474 proc.argv = argv;
1475 proc.in = -1;
1476 proc.stdout_to_stderr = 1;
1478 code = start_command(&proc);
1479 if (code)
1480 return code;
1481 n = snprintf(buf, sizeof(buf), "%s %s\n",
1482 sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
1483 write_in_full(proc.in, buf, n);
1484 close(proc.in);
1485 return finish_command(&proc);
1488 int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
1490 const char *hook_env[3] = { NULL };
1491 char index[PATH_MAX];
1492 va_list args;
1493 int ret;
1495 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
1496 hook_env[0] = index;
1499 * Let the hook know that no editor will be launched.
1501 if (!editor_is_used)
1502 hook_env[1] = "GIT_EDITOR=:";
1504 va_start(args, name);
1505 ret = run_hook_ve(hook_env, name, args);
1506 va_end(args);
1508 return ret;
1511 int cmd_commit(int argc, const char **argv, const char *prefix)
1513 static struct wt_status s;
1514 static struct option builtin_commit_options[] = {
1515 OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
1516 OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
1518 OPT_GROUP(N_("Commit message options")),
1519 OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
1520 OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
1521 OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
1522 OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
1523 OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
1524 OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
1525 OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
1526 OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
1527 OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
1528 OPT_BOOL('s', "signoff", &signoff, N_("add Signed-off-by:")),
1529 OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
1530 OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
1531 OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
1532 OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
1533 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
1534 N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
1535 /* end commit message options */
1537 OPT_GROUP(N_("Commit contents options")),
1538 OPT_BOOL('a', "all", &all, N_("commit all changed files")),
1539 OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")),
1540 OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
1541 OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
1542 OPT_BOOL('o', "only", &only, N_("commit only specified files")),
1543 OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit hook")),
1544 OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),
1545 OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
1546 STATUS_FORMAT_SHORT),
1547 OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
1548 OPT_SET_INT(0, "porcelain", &status_format,
1549 N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
1550 OPT_SET_INT(0, "long", &status_format,
1551 N_("show status in long format (default)"),
1552 STATUS_FORMAT_LONG),
1553 OPT_BOOL('z', "null", &s.null_termination,
1554 N_("terminate entries with NUL")),
1555 OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
1556 OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
1557 { 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" },
1558 /* end commit contents options */
1560 OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
1561 N_("ok to record an empty change")),
1562 OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message,
1563 N_("ok to record a change with an empty message")),
1565 OPT_END()
1568 struct strbuf sb = STRBUF_INIT;
1569 struct strbuf author_ident = STRBUF_INIT;
1570 const char *index_file, *reflog_msg;
1571 char *nl;
1572 unsigned char sha1[20];
1573 struct ref_lock *ref_lock;
1574 struct commit_list *parents = NULL, **pptr = &parents;
1575 struct stat statbuf;
1576 struct commit *current_head = NULL;
1577 struct commit_extra_header *extra = NULL;
1579 if (argc == 2 && !strcmp(argv[1], "-h"))
1580 usage_with_options(builtin_commit_usage, builtin_commit_options);
1582 status_init_config(&s, git_commit_config);
1583 status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
1584 s.colopts = 0;
1586 if (get_sha1("HEAD", sha1))
1587 current_head = NULL;
1588 else {
1589 current_head = lookup_commit_or_die(sha1, "HEAD");
1590 if (parse_commit(current_head))
1591 die(_("could not parse HEAD commit"));
1593 argc = parse_and_validate_options(argc, argv, builtin_commit_options,
1594 builtin_commit_usage,
1595 prefix, current_head, &s);
1596 if (dry_run)
1597 return dry_run_commit(argc, argv, prefix, current_head, &s);
1598 index_file = prepare_index(argc, argv, prefix, current_head, 0);
1600 /* Set up everything for writing the commit object. This includes
1601 running hooks, writing the trees, and interacting with the user. */
1602 if (!prepare_to_commit(index_file, prefix,
1603 current_head, &s, &author_ident)) {
1604 rollback_index_files();
1605 return 1;
1608 /* Determine parents */
1609 reflog_msg = getenv("GIT_REFLOG_ACTION");
1610 if (!current_head) {
1611 if (!reflog_msg)
1612 reflog_msg = "commit (initial)";
1613 } else if (amend) {
1614 struct commit_list *c;
1616 if (!reflog_msg)
1617 reflog_msg = "commit (amend)";
1618 for (c = current_head->parents; c; c = c->next)
1619 pptr = &commit_list_insert(c->item, pptr)->next;
1620 } else if (whence == FROM_MERGE) {
1621 struct strbuf m = STRBUF_INIT;
1622 FILE *fp;
1623 int allow_fast_forward = 1;
1625 if (!reflog_msg)
1626 reflog_msg = "commit (merge)";
1627 pptr = &commit_list_insert(current_head, pptr)->next;
1628 fp = fopen(git_path("MERGE_HEAD"), "r");
1629 if (fp == NULL)
1630 die_errno(_("could not open '%s' for reading"),
1631 git_path("MERGE_HEAD"));
1632 while (strbuf_getline(&m, fp, '\n') != EOF) {
1633 struct commit *parent;
1635 parent = get_merge_parent(m.buf);
1636 if (!parent)
1637 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1638 pptr = &commit_list_insert(parent, pptr)->next;
1640 fclose(fp);
1641 strbuf_release(&m);
1642 if (!stat(git_path("MERGE_MODE"), &statbuf)) {
1643 if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1644 die_errno(_("could not read MERGE_MODE"));
1645 if (!strcmp(sb.buf, "no-ff"))
1646 allow_fast_forward = 0;
1648 if (allow_fast_forward)
1649 parents = reduce_heads(parents);
1650 } else {
1651 if (!reflog_msg)
1652 reflog_msg = (whence == FROM_CHERRY_PICK)
1653 ? "commit (cherry-pick)"
1654 : "commit";
1655 pptr = &commit_list_insert(current_head, pptr)->next;
1658 /* Finally, get the commit message */
1659 strbuf_reset(&sb);
1660 if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1661 int saved_errno = errno;
1662 rollback_index_files();
1663 die(_("could not read commit message: %s"), strerror(saved_errno));
1666 if (verbose || /* Truncate the message just before the diff, if any. */
1667 cleanup_mode == CLEANUP_SCISSORS)
1668 wt_status_truncate_message_at_cut_line(&sb);
1670 if (cleanup_mode != CLEANUP_NONE)
1671 stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1672 if (template_untouched(&sb) && !allow_empty_message) {
1673 rollback_index_files();
1674 fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
1675 exit(1);
1677 if (message_is_empty(&sb) && !allow_empty_message) {
1678 rollback_index_files();
1679 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
1680 exit(1);
1683 if (amend) {
1684 const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1685 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1686 } else {
1687 struct commit_extra_header **tail = &extra;
1688 append_merge_tag_headers(parents, &tail);
1691 if (commit_tree_extended(&sb, active_cache_tree->sha1, parents, sha1,
1692 author_ident.buf, sign_commit, extra)) {
1693 rollback_index_files();
1694 die(_("failed to write commit object"));
1696 strbuf_release(&author_ident);
1697 free_commit_extra_headers(extra);
1699 ref_lock = lock_any_ref_for_update("HEAD",
1700 !current_head
1701 ? NULL
1702 : current_head->object.sha1,
1703 0, NULL);
1705 nl = strchr(sb.buf, '\n');
1706 if (nl)
1707 strbuf_setlen(&sb, nl + 1 - sb.buf);
1708 else
1709 strbuf_addch(&sb, '\n');
1710 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1711 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1713 if (!ref_lock) {
1714 rollback_index_files();
1715 die(_("cannot lock HEAD ref"));
1717 if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1718 rollback_index_files();
1719 die(_("cannot update HEAD ref"));
1722 unlink(git_path("CHERRY_PICK_HEAD"));
1723 unlink(git_path("REVERT_HEAD"));
1724 unlink(git_path("MERGE_HEAD"));
1725 unlink(git_path("MERGE_MSG"));
1726 unlink(git_path("MERGE_MODE"));
1727 unlink(git_path("SQUASH_MSG"));
1729 if (commit_index_files())
1730 die (_("Repository has been updated, but unable to write\n"
1731 "new_index file. Check that disk is not full or quota is\n"
1732 "not exceeded, and then \"git reset HEAD\" to recover."));
1734 rerere(0);
1735 run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
1736 if (amend && !no_post_rewrite) {
1737 struct notes_rewrite_cfg *cfg;
1738 cfg = init_copy_notes_for_rewrite("amend");
1739 if (cfg) {
1740 /* we are amending, so current_head is not NULL */
1741 copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1742 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1744 run_rewrite_hook(current_head->object.sha1, sha1);
1746 if (!quiet)
1747 print_summary(prefix, sha1, !current_head);
1749 return 0;