commit: accept more date formats for "--date"
[git.git] / builtin / commit.c
blobd1c90db95d3f89d8417ee8652c4eeee82982c6ed
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);
346 commit_style = COMMIT_NORMAL;
347 return index_lock.filename;
351 * Non partial, non as-is commit.
353 * (1) get the real index;
354 * (2) update the_index as necessary;
355 * (3) write the_index out to the real index (still locked);
356 * (4) return the name of the locked index file.
358 * The caller should run hooks on the locked real index, and
359 * (A) if all goes well, commit the real index;
360 * (B) on failure, rollback the real index.
362 if (all || (also && pathspec.nr)) {
363 fd = hold_locked_index(&index_lock, 1);
364 add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
365 refresh_cache_or_die(refresh_flags);
366 update_main_cache_tree(WRITE_TREE_SILENT);
367 if (write_cache(fd, active_cache, active_nr) ||
368 close_lock_file(&index_lock))
369 die(_("unable to write new_index file"));
370 commit_style = COMMIT_NORMAL;
371 return index_lock.filename;
375 * As-is commit.
377 * (1) return the name of the real index file.
379 * The caller should run hooks on the real index,
380 * and create commit from the_index.
381 * We still need to refresh the index here.
383 if (!only && !pathspec.nr) {
384 fd = hold_locked_index(&index_lock, 1);
385 refresh_cache_or_die(refresh_flags);
386 if (active_cache_changed) {
387 update_main_cache_tree(WRITE_TREE_SILENT);
388 if (write_cache(fd, active_cache, active_nr) ||
389 commit_locked_index(&index_lock))
390 die(_("unable to write new_index file"));
391 } else {
392 rollback_lock_file(&index_lock);
394 commit_style = COMMIT_AS_IS;
395 return get_index_file();
399 * A partial commit.
401 * (0) find the set of affected paths;
402 * (1) get lock on the real index file;
403 * (2) update the_index with the given paths;
404 * (3) write the_index out to the real index (still locked);
405 * (4) get lock on the false index file;
406 * (5) reset the_index from HEAD;
407 * (6) update the_index the same way as (2);
408 * (7) write the_index out to the false index file;
409 * (8) return the name of the false index file (still locked);
411 * The caller should run hooks on the locked false index, and
412 * create commit from it. Then
413 * (A) if all goes well, commit the real index;
414 * (B) on failure, rollback the real index;
415 * In either case, rollback the false index.
417 commit_style = COMMIT_PARTIAL;
419 if (whence != FROM_COMMIT) {
420 if (whence == FROM_MERGE)
421 die(_("cannot do a partial commit during a merge."));
422 else if (whence == FROM_CHERRY_PICK)
423 die(_("cannot do a partial commit during a cherry-pick."));
426 memset(&partial, 0, sizeof(partial));
427 partial.strdup_strings = 1;
428 if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
429 exit(1);
431 discard_cache();
432 if (read_cache() < 0)
433 die(_("cannot read the index"));
435 fd = hold_locked_index(&index_lock, 1);
436 add_remove_files(&partial);
437 refresh_cache(REFRESH_QUIET);
438 if (write_cache(fd, active_cache, active_nr) ||
439 close_lock_file(&index_lock))
440 die(_("unable to write new_index file"));
442 fd = hold_lock_file_for_update(&false_lock,
443 git_path("next-index-%"PRIuMAX,
444 (uintmax_t) getpid()),
445 LOCK_DIE_ON_ERROR);
447 create_base_index(current_head);
448 add_remove_files(&partial);
449 refresh_cache(REFRESH_QUIET);
451 if (write_cache(fd, active_cache, active_nr) ||
452 close_lock_file(&false_lock))
453 die(_("unable to write temporary index file"));
455 discard_cache();
456 read_cache_from(false_lock.filename);
458 return false_lock.filename;
461 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
462 struct wt_status *s)
464 unsigned char sha1[20];
466 if (s->relative_paths)
467 s->prefix = prefix;
469 if (amend) {
470 s->amend = 1;
471 s->reference = "HEAD^1";
473 s->verbose = verbose;
474 s->index_file = index_file;
475 s->fp = fp;
476 s->nowarn = nowarn;
477 s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
479 wt_status_collect(s);
481 switch (status_format) {
482 case STATUS_FORMAT_SHORT:
483 wt_shortstatus_print(s);
484 break;
485 case STATUS_FORMAT_PORCELAIN:
486 wt_porcelain_print(s);
487 break;
488 case STATUS_FORMAT_UNSPECIFIED:
489 die("BUG: finalize_deferred_config() should have been called");
490 break;
491 case STATUS_FORMAT_NONE:
492 case STATUS_FORMAT_LONG:
493 wt_status_print(s);
494 break;
497 return s->commitable;
500 static int is_a_merge(const struct commit *current_head)
502 return !!(current_head->parents && current_head->parents->next);
505 static void export_one(const char *var, const char *s, const char *e, int hack)
507 struct strbuf buf = STRBUF_INIT;
508 if (hack)
509 strbuf_addch(&buf, hack);
510 strbuf_addf(&buf, "%.*s", (int)(e - s), s);
511 setenv(var, buf.buf, 1);
512 strbuf_release(&buf);
515 static int sane_ident_split(struct ident_split *person)
517 if (!person->name_begin || !person->name_end ||
518 person->name_begin == person->name_end)
519 return 0; /* no human readable name */
520 if (!person->mail_begin || !person->mail_end ||
521 person->mail_begin == person->mail_end)
522 return 0; /* no usable mail */
523 if (!person->date_begin || !person->date_end ||
524 !person->tz_begin || !person->tz_end)
525 return 0;
526 return 1;
529 static int parse_force_date(const char *in, char *out, int len)
531 if (len < 1)
532 return -1;
533 *out++ = '@';
534 len--;
536 if (parse_date(in, out, len) < 0) {
537 int errors = 0;
538 unsigned long t = approxidate_careful(in, &errors);
539 if (errors)
540 return -1;
541 snprintf(out, len, "%lu", t);
544 return 0;
547 static void determine_author_info(struct strbuf *author_ident)
549 char *name, *email, *date;
550 struct ident_split author;
551 char date_buf[64];
553 name = getenv("GIT_AUTHOR_NAME");
554 email = getenv("GIT_AUTHOR_EMAIL");
555 date = getenv("GIT_AUTHOR_DATE");
557 if (author_message) {
558 const char *a, *lb, *rb, *eol;
559 size_t len;
561 a = strstr(author_message_buffer, "\nauthor ");
562 if (!a)
563 die(_("invalid commit: %s"), author_message);
565 lb = strchrnul(a + strlen("\nauthor "), '<');
566 rb = strchrnul(lb, '>');
567 eol = strchrnul(rb, '\n');
568 if (!*lb || !*rb || !*eol)
569 die(_("invalid commit: %s"), author_message);
571 if (lb == a + strlen("\nauthor "))
572 /* \nauthor <foo@example.com> */
573 name = xcalloc(1, 1);
574 else
575 name = xmemdupz(a + strlen("\nauthor "),
576 (lb - strlen(" ") -
577 (a + strlen("\nauthor "))));
578 email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
579 len = eol - (rb + strlen("> "));
580 date = xmalloc(len + 2);
581 *date = '@';
582 memcpy(date + 1, rb + strlen("> "), len);
583 date[len + 1] = '\0';
586 if (force_author) {
587 const char *lb = strstr(force_author, " <");
588 const char *rb = strchr(force_author, '>');
590 if (!lb || !rb)
591 die(_("malformed --author parameter"));
592 name = xstrndup(force_author, lb - force_author);
593 email = xstrndup(lb + 2, rb - (lb + 2));
596 if (force_date) {
597 if (parse_force_date(force_date, date_buf, sizeof(date_buf)))
598 die(_("invalid date format: %s"), force_date);
599 date = date_buf;
602 strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
603 if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
604 sane_ident_split(&author)) {
605 export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
606 export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
607 export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
611 static void split_ident_or_die(struct ident_split *id, const struct strbuf *buf)
613 if (split_ident_line(id, buf->buf, buf->len) ||
614 !sane_ident_split(id))
615 die(_("Malformed ident string: '%s'"), buf->buf);
618 static int author_date_is_interesting(void)
620 return author_message || force_date;
623 static int prepare_to_commit(const char *index_file, const char *prefix,
624 struct commit *current_head,
625 struct wt_status *s,
626 struct strbuf *author_ident)
628 struct stat statbuf;
629 struct strbuf committer_ident = STRBUF_INIT;
630 int commitable;
631 struct strbuf sb = STRBUF_INIT;
632 const char *hook_arg1 = NULL;
633 const char *hook_arg2 = NULL;
634 int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
635 int old_display_comment_prefix;
637 /* This checks and barfs if author is badly specified */
638 determine_author_info(author_ident);
640 if (!no_verify && run_commit_hook(use_editor, index_file, "pre-commit", NULL))
641 return 0;
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! ");
650 else {
651 struct pretty_print_context ctx = {0};
652 struct commit *c;
653 c = lookup_commit_reference_by_name(squash_message);
654 if (!c)
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,
658 &ctx);
662 if (message.len) {
663 strbuf_addbuf(&sb, &message);
664 hook_arg1 = "message";
665 } else if (logfile && !strcmp(logfile, "-")) {
666 if (isatty(0))
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'"),
674 logfile);
675 hook_arg1 = "message";
676 } else if (use_message) {
677 char *buffer;
678 buffer = strstr(use_message_buffer, "\n\n");
679 if (!use_editor && (!buffer || buffer[2] == '\0'))
680 die(_("commit has empty message"));
681 strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
682 hook_arg1 = "commit";
683 hook_arg2 = use_message;
684 } else if (fixup_message) {
685 struct pretty_print_context ctx = {0};
686 struct commit *commit;
687 commit = lookup_commit_reference_by_name(fixup_message);
688 if (!commit)
689 die(_("could not lookup commit %s"), fixup_message);
690 ctx.output_encoding = get_commit_output_encoding();
691 format_commit_message(commit, "fixup! %s\n\n",
692 &sb, &ctx);
693 hook_arg1 = "message";
694 } else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
695 if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
696 die_errno(_("could not read MERGE_MSG"));
697 hook_arg1 = "merge";
698 } else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
699 if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
700 die_errno(_("could not read SQUASH_MSG"));
701 hook_arg1 = "squash";
702 } else if (template_file) {
703 if (strbuf_read_file(&sb, template_file, 0) < 0)
704 die_errno(_("could not read '%s'"), template_file);
705 hook_arg1 = "template";
706 clean_message_contents = 0;
710 * The remaining cases don't modify the template message, but
711 * just set the argument(s) to the prepare-commit-msg hook.
713 else if (whence == FROM_MERGE)
714 hook_arg1 = "merge";
715 else if (whence == FROM_CHERRY_PICK) {
716 hook_arg1 = "commit";
717 hook_arg2 = "CHERRY_PICK_HEAD";
720 if (squash_message) {
722 * If squash_commit was used for the commit subject,
723 * then we're possibly hijacking other commit log options.
724 * Reset the hook args to tell the real story.
726 hook_arg1 = "message";
727 hook_arg2 = "";
730 s->fp = fopen(git_path(commit_editmsg), "w");
731 if (s->fp == NULL)
732 die_errno(_("could not open '%s'"), git_path(commit_editmsg));
734 /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
735 old_display_comment_prefix = s->display_comment_prefix;
736 s->display_comment_prefix = 1;
739 * Most hints are counter-productive when the commit has
740 * already started.
742 s->hints = 0;
744 if (clean_message_contents)
745 stripspace(&sb, 0);
747 if (signoff) {
749 * See if we have a Conflicts: block at the end. If yes, count
750 * its size, so we can ignore it.
752 int ignore_footer = 0;
753 int i, eol, previous = 0;
754 const char *nl;
756 for (i = 0; i < sb.len; i++) {
757 nl = memchr(sb.buf + i, '\n', sb.len - i);
758 if (nl)
759 eol = nl - sb.buf;
760 else
761 eol = sb.len;
762 if (starts_with(sb.buf + previous, "\nConflicts:\n")) {
763 ignore_footer = sb.len - previous;
764 break;
766 while (i < eol)
767 i++;
768 previous = eol;
771 append_signoff(&sb, ignore_footer, 0);
774 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
775 die_errno(_("could not write commit template"));
777 strbuf_release(&sb);
779 /* This checks if committer ident is explicitly given */
780 strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
781 if (use_editor && include_status) {
782 int ident_shown = 0;
783 int saved_color_setting;
784 struct ident_split ci, ai;
786 if (whence != FROM_COMMIT) {
787 if (cleanup_mode == CLEANUP_SCISSORS)
788 wt_status_add_cut_line(s->fp);
789 status_printf_ln(s, GIT_COLOR_NORMAL,
790 whence == FROM_MERGE
791 ? _("\n"
792 "It looks like you may be committing a merge.\n"
793 "If this is not correct, please remove the file\n"
794 " %s\n"
795 "and try again.\n")
796 : _("\n"
797 "It looks like you may be committing a cherry-pick.\n"
798 "If this is not correct, please remove the file\n"
799 " %s\n"
800 "and try again.\n"),
801 git_path(whence == FROM_MERGE
802 ? "MERGE_HEAD"
803 : "CHERRY_PICK_HEAD"));
806 fprintf(s->fp, "\n");
807 if (cleanup_mode == CLEANUP_ALL)
808 status_printf(s, GIT_COLOR_NORMAL,
809 _("Please enter the commit message for your changes."
810 " Lines starting\nwith '%c' will be ignored, and an empty"
811 " message aborts the commit.\n"), comment_line_char);
812 else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
813 wt_status_add_cut_line(s->fp);
814 else /* CLEANUP_SPACE, that is. */
815 status_printf(s, GIT_COLOR_NORMAL,
816 _("Please enter the commit message for your changes."
817 " Lines starting\n"
818 "with '%c' will be kept; you may remove them"
819 " yourself if you want to.\n"
820 "An empty message aborts the commit.\n"), comment_line_char);
821 if (only_include_assumed)
822 status_printf_ln(s, GIT_COLOR_NORMAL,
823 "%s", only_include_assumed);
825 split_ident_or_die(&ai, author_ident);
826 split_ident_or_die(&ci, &committer_ident);
828 if (ident_cmp(&ai, &ci))
829 status_printf_ln(s, GIT_COLOR_NORMAL,
830 _("%s"
831 "Author: %.*s <%.*s>"),
832 ident_shown++ ? "" : "\n",
833 (int)(ai.name_end - ai.name_begin), ai.name_begin,
834 (int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
836 if (author_date_is_interesting())
837 status_printf_ln(s, GIT_COLOR_NORMAL,
838 _("%s"
839 "Date: %s"),
840 ident_shown++ ? "" : "\n",
841 show_ident_date(&ai, DATE_NORMAL));
843 if (!committer_ident_sufficiently_given())
844 status_printf_ln(s, GIT_COLOR_NORMAL,
845 _("%s"
846 "Committer: %.*s <%.*s>"),
847 ident_shown++ ? "" : "\n",
848 (int)(ci.name_end - ci.name_begin), ci.name_begin,
849 (int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
851 if (ident_shown)
852 status_printf_ln(s, GIT_COLOR_NORMAL, "");
854 saved_color_setting = s->use_color;
855 s->use_color = 0;
856 commitable = run_status(s->fp, index_file, prefix, 1, s);
857 s->use_color = saved_color_setting;
858 } else {
859 unsigned char sha1[20];
860 const char *parent = "HEAD";
862 if (!active_nr && read_cache() < 0)
863 die(_("Cannot read index"));
865 if (amend)
866 parent = "HEAD^1";
868 if (get_sha1(parent, sha1))
869 commitable = !!active_nr;
870 else
871 commitable = index_differs_from(parent, 0);
873 strbuf_release(&committer_ident);
875 fclose(s->fp);
878 * Reject an attempt to record a non-merge empty commit without
879 * explicit --allow-empty. In the cherry-pick case, it may be
880 * empty due to conflict resolution, which the user should okay.
882 if (!commitable && whence != FROM_MERGE && !allow_empty &&
883 !(amend && is_a_merge(current_head))) {
884 s->display_comment_prefix = old_display_comment_prefix;
885 run_status(stdout, index_file, prefix, 0, s);
886 if (amend)
887 fputs(_(empty_amend_advice), stderr);
888 else if (whence == FROM_CHERRY_PICK) {
889 fputs(_(empty_cherry_pick_advice), stderr);
890 if (!sequencer_in_use)
891 fputs(_(empty_cherry_pick_advice_single), stderr);
892 else
893 fputs(_(empty_cherry_pick_advice_multi), stderr);
895 return 0;
899 * Re-read the index as pre-commit hook could have updated it,
900 * and write it out as a tree. We must do this before we invoke
901 * the editor and after we invoke run_status above.
903 discard_cache();
904 read_cache_from(index_file);
905 if (update_main_cache_tree(0)) {
906 error(_("Error building trees"));
907 return 0;
910 if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
911 git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
912 return 0;
914 if (use_editor) {
915 char index[PATH_MAX];
916 const char *env[2] = { NULL };
917 env[0] = index;
918 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
919 if (launch_editor(git_path(commit_editmsg), NULL, env)) {
920 fprintf(stderr,
921 _("Please supply the message using either -m or -F option.\n"));
922 exit(1);
926 if (!no_verify &&
927 run_commit_hook(use_editor, index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
928 return 0;
931 return 1;
934 static int rest_is_empty(struct strbuf *sb, int start)
936 int i, eol;
937 const char *nl;
939 /* Check if the rest is just whitespace and Signed-of-by's. */
940 for (i = start; i < sb->len; i++) {
941 nl = memchr(sb->buf + i, '\n', sb->len - i);
942 if (nl)
943 eol = nl - sb->buf;
944 else
945 eol = sb->len;
947 if (strlen(sign_off_header) <= eol - i &&
948 starts_with(sb->buf + i, sign_off_header)) {
949 i = eol;
950 continue;
952 while (i < eol)
953 if (!isspace(sb->buf[i++]))
954 return 0;
957 return 1;
961 * Find out if the message in the strbuf contains only whitespace and
962 * Signed-off-by lines.
964 static int message_is_empty(struct strbuf *sb)
966 if (cleanup_mode == CLEANUP_NONE && sb->len)
967 return 0;
968 return rest_is_empty(sb, 0);
972 * See if the user edited the message in the editor or left what
973 * was in the template intact
975 static int template_untouched(struct strbuf *sb)
977 struct strbuf tmpl = STRBUF_INIT;
978 char *start;
980 if (cleanup_mode == CLEANUP_NONE && sb->len)
981 return 0;
983 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
984 return 0;
986 stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
987 start = (char *)skip_prefix(sb->buf, tmpl.buf);
988 if (!start)
989 start = sb->buf;
990 strbuf_release(&tmpl);
991 return rest_is_empty(sb, start - sb->buf);
994 static const char *find_author_by_nickname(const char *name)
996 struct rev_info revs;
997 struct commit *commit;
998 struct strbuf buf = STRBUF_INIT;
999 struct string_list mailmap = STRING_LIST_INIT_NODUP;
1000 const char *av[20];
1001 int ac = 0;
1003 init_revisions(&revs, NULL);
1004 strbuf_addf(&buf, "--author=%s", name);
1005 av[++ac] = "--all";
1006 av[++ac] = "-i";
1007 av[++ac] = buf.buf;
1008 av[++ac] = NULL;
1009 setup_revisions(ac, av, &revs, NULL);
1010 revs.mailmap = &mailmap;
1011 read_mailmap(revs.mailmap, NULL);
1013 prepare_revision_walk(&revs);
1014 commit = get_revision(&revs);
1015 if (commit) {
1016 struct pretty_print_context ctx = {0};
1017 ctx.date_mode = DATE_NORMAL;
1018 strbuf_release(&buf);
1019 format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
1020 clear_mailmap(&mailmap);
1021 return strbuf_detach(&buf, NULL);
1023 die(_("No existing author found with '%s'"), name);
1027 static void handle_untracked_files_arg(struct wt_status *s)
1029 if (!untracked_files_arg)
1030 ; /* default already initialized */
1031 else if (!strcmp(untracked_files_arg, "no"))
1032 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1033 else if (!strcmp(untracked_files_arg, "normal"))
1034 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1035 else if (!strcmp(untracked_files_arg, "all"))
1036 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1037 else
1038 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
1041 static const char *read_commit_message(const char *name)
1043 const char *out_enc;
1044 struct commit *commit;
1046 commit = lookup_commit_reference_by_name(name);
1047 if (!commit)
1048 die(_("could not lookup commit %s"), name);
1049 out_enc = get_commit_output_encoding();
1050 return logmsg_reencode(commit, NULL, out_enc);
1054 * Enumerate what needs to be propagated when --porcelain
1055 * is not in effect here.
1057 static struct status_deferred_config {
1058 enum status_format status_format;
1059 int show_branch;
1060 } status_deferred_config = {
1061 STATUS_FORMAT_UNSPECIFIED,
1062 -1 /* unspecified */
1065 static void finalize_deferred_config(struct wt_status *s)
1067 int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
1068 !s->null_termination);
1070 if (s->null_termination) {
1071 if (status_format == STATUS_FORMAT_NONE ||
1072 status_format == STATUS_FORMAT_UNSPECIFIED)
1073 status_format = STATUS_FORMAT_PORCELAIN;
1074 else if (status_format == STATUS_FORMAT_LONG)
1075 die(_("--long and -z are incompatible"));
1078 if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED)
1079 status_format = status_deferred_config.status_format;
1080 if (status_format == STATUS_FORMAT_UNSPECIFIED)
1081 status_format = STATUS_FORMAT_NONE;
1083 if (use_deferred_config && s->show_branch < 0)
1084 s->show_branch = status_deferred_config.show_branch;
1085 if (s->show_branch < 0)
1086 s->show_branch = 0;
1089 static int parse_and_validate_options(int argc, const char *argv[],
1090 const struct option *options,
1091 const char * const usage[],
1092 const char *prefix,
1093 struct commit *current_head,
1094 struct wt_status *s)
1096 int f = 0;
1098 argc = parse_options(argc, argv, prefix, options, usage, 0);
1099 finalize_deferred_config(s);
1101 if (force_author && !strchr(force_author, '>'))
1102 force_author = find_author_by_nickname(force_author);
1104 if (force_author && renew_authorship)
1105 die(_("Using both --reset-author and --author does not make sense"));
1107 if (logfile || have_option_m || use_message || fixup_message)
1108 use_editor = 0;
1109 if (0 <= edit_flag)
1110 use_editor = edit_flag;
1112 /* Sanity check options */
1113 if (amend && !current_head)
1114 die(_("You have nothing to amend."));
1115 if (amend && whence != FROM_COMMIT) {
1116 if (whence == FROM_MERGE)
1117 die(_("You are in the middle of a merge -- cannot amend."));
1118 else if (whence == FROM_CHERRY_PICK)
1119 die(_("You are in the middle of a cherry-pick -- cannot amend."));
1121 if (fixup_message && squash_message)
1122 die(_("Options --squash and --fixup cannot be used together"));
1123 if (use_message)
1124 f++;
1125 if (edit_message)
1126 f++;
1127 if (fixup_message)
1128 f++;
1129 if (logfile)
1130 f++;
1131 if (f > 1)
1132 die(_("Only one of -c/-C/-F/--fixup can be used."));
1133 if (message.len && f > 0)
1134 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1135 if (f || message.len)
1136 template_file = NULL;
1137 if (edit_message)
1138 use_message = edit_message;
1139 if (amend && !use_message && !fixup_message)
1140 use_message = "HEAD";
1141 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1142 die(_("--reset-author can be used only with -C, -c or --amend."));
1143 if (use_message) {
1144 use_message_buffer = read_commit_message(use_message);
1145 if (!renew_authorship) {
1146 author_message = use_message;
1147 author_message_buffer = use_message_buffer;
1150 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1151 author_message = "CHERRY_PICK_HEAD";
1152 author_message_buffer = read_commit_message(author_message);
1155 if (patch_interactive)
1156 interactive = 1;
1158 if (also + only + all + interactive > 1)
1159 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
1160 if (argc == 0 && (also || (only && !amend)))
1161 die(_("No paths with --include/--only does not make sense."));
1162 if (argc == 0 && only && amend)
1163 only_include_assumed = _("Clever... amending the last one with dirty index.");
1164 if (argc > 0 && !also && !only)
1165 only_include_assumed = _("Explicit paths specified without -i or -o; assuming --only paths...");
1166 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1167 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1168 else if (!strcmp(cleanup_arg, "verbatim"))
1169 cleanup_mode = CLEANUP_NONE;
1170 else if (!strcmp(cleanup_arg, "whitespace"))
1171 cleanup_mode = CLEANUP_SPACE;
1172 else if (!strcmp(cleanup_arg, "strip"))
1173 cleanup_mode = CLEANUP_ALL;
1174 else if (!strcmp(cleanup_arg, "scissors"))
1175 cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
1176 else
1177 die(_("Invalid cleanup mode %s"), cleanup_arg);
1179 handle_untracked_files_arg(s);
1181 if (all && argc > 0)
1182 die(_("Paths with -a does not make sense."));
1184 if (status_format != STATUS_FORMAT_NONE)
1185 dry_run = 1;
1187 return argc;
1190 static int dry_run_commit(int argc, const char **argv, const char *prefix,
1191 const struct commit *current_head, struct wt_status *s)
1193 int commitable;
1194 const char *index_file;
1196 index_file = prepare_index(argc, argv, prefix, current_head, 1);
1197 commitable = run_status(stdout, index_file, prefix, 0, s);
1198 rollback_index_files();
1200 return commitable ? 0 : 1;
1203 static int parse_status_slot(const char *var, int offset)
1205 if (!strcasecmp(var+offset, "header"))
1206 return WT_STATUS_HEADER;
1207 if (!strcasecmp(var+offset, "branch"))
1208 return WT_STATUS_ONBRANCH;
1209 if (!strcasecmp(var+offset, "updated")
1210 || !strcasecmp(var+offset, "added"))
1211 return WT_STATUS_UPDATED;
1212 if (!strcasecmp(var+offset, "changed"))
1213 return WT_STATUS_CHANGED;
1214 if (!strcasecmp(var+offset, "untracked"))
1215 return WT_STATUS_UNTRACKED;
1216 if (!strcasecmp(var+offset, "nobranch"))
1217 return WT_STATUS_NOBRANCH;
1218 if (!strcasecmp(var+offset, "unmerged"))
1219 return WT_STATUS_UNMERGED;
1220 return -1;
1223 static int git_status_config(const char *k, const char *v, void *cb)
1225 struct wt_status *s = cb;
1227 if (starts_with(k, "column."))
1228 return git_column_config(k, v, "status", &s->colopts);
1229 if (!strcmp(k, "status.submodulesummary")) {
1230 int is_bool;
1231 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1232 if (is_bool && s->submodule_summary)
1233 s->submodule_summary = -1;
1234 return 0;
1236 if (!strcmp(k, "status.short")) {
1237 if (git_config_bool(k, v))
1238 status_deferred_config.status_format = STATUS_FORMAT_SHORT;
1239 else
1240 status_deferred_config.status_format = STATUS_FORMAT_NONE;
1241 return 0;
1243 if (!strcmp(k, "status.branch")) {
1244 status_deferred_config.show_branch = git_config_bool(k, v);
1245 return 0;
1247 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1248 s->use_color = git_config_colorbool(k, v);
1249 return 0;
1251 if (!strcmp(k, "status.displaycommentprefix")) {
1252 s->display_comment_prefix = git_config_bool(k, v);
1253 return 0;
1255 if (starts_with(k, "status.color.") || starts_with(k, "color.status.")) {
1256 int slot = parse_status_slot(k, 13);
1257 if (slot < 0)
1258 return 0;
1259 if (!v)
1260 return config_error_nonbool(k);
1261 color_parse(v, k, s->color_palette[slot]);
1262 return 0;
1264 if (!strcmp(k, "status.relativepaths")) {
1265 s->relative_paths = git_config_bool(k, v);
1266 return 0;
1268 if (!strcmp(k, "status.showuntrackedfiles")) {
1269 if (!v)
1270 return config_error_nonbool(k);
1271 else if (!strcmp(v, "no"))
1272 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1273 else if (!strcmp(v, "normal"))
1274 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1275 else if (!strcmp(v, "all"))
1276 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1277 else
1278 return error(_("Invalid untracked files mode '%s'"), v);
1279 return 0;
1281 return git_diff_ui_config(k, v, NULL);
1284 int cmd_status(int argc, const char **argv, const char *prefix)
1286 static struct wt_status s;
1287 int fd;
1288 unsigned char sha1[20];
1289 static struct option builtin_status_options[] = {
1290 OPT__VERBOSE(&verbose, N_("be verbose")),
1291 OPT_SET_INT('s', "short", &status_format,
1292 N_("show status concisely"), STATUS_FORMAT_SHORT),
1293 OPT_BOOL('b', "branch", &s.show_branch,
1294 N_("show branch information")),
1295 OPT_SET_INT(0, "porcelain", &status_format,
1296 N_("machine-readable output"),
1297 STATUS_FORMAT_PORCELAIN),
1298 OPT_SET_INT(0, "long", &status_format,
1299 N_("show status in long format (default)"),
1300 STATUS_FORMAT_LONG),
1301 OPT_BOOL('z', "null", &s.null_termination,
1302 N_("terminate entries with NUL")),
1303 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1304 N_("mode"),
1305 N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
1306 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1307 OPT_BOOL(0, "ignored", &show_ignored_in_status,
1308 N_("show ignored files")),
1309 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
1310 N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
1311 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1312 OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
1313 OPT_END(),
1316 if (argc == 2 && !strcmp(argv[1], "-h"))
1317 usage_with_options(builtin_status_usage, builtin_status_options);
1319 status_init_config(&s, git_status_config);
1320 argc = parse_options(argc, argv, prefix,
1321 builtin_status_options,
1322 builtin_status_usage, 0);
1323 finalize_colopts(&s.colopts, -1);
1324 finalize_deferred_config(&s);
1326 handle_untracked_files_arg(&s);
1327 if (show_ignored_in_status)
1328 s.show_ignored_files = 1;
1329 parse_pathspec(&s.pathspec, 0,
1330 PATHSPEC_PREFER_FULL,
1331 prefix, argv);
1333 read_cache_preload(&s.pathspec);
1334 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
1336 fd = hold_locked_index(&index_lock, 0);
1337 if (0 <= fd)
1338 update_index_if_able(&the_index, &index_lock);
1340 s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1341 s.ignore_submodule_arg = ignore_submodule_arg;
1342 wt_status_collect(&s);
1344 if (s.relative_paths)
1345 s.prefix = prefix;
1347 switch (status_format) {
1348 case STATUS_FORMAT_SHORT:
1349 wt_shortstatus_print(&s);
1350 break;
1351 case STATUS_FORMAT_PORCELAIN:
1352 wt_porcelain_print(&s);
1353 break;
1354 case STATUS_FORMAT_UNSPECIFIED:
1355 die("BUG: finalize_deferred_config() should have been called");
1356 break;
1357 case STATUS_FORMAT_NONE:
1358 case STATUS_FORMAT_LONG:
1359 s.verbose = verbose;
1360 s.ignore_submodule_arg = ignore_submodule_arg;
1361 wt_status_print(&s);
1362 break;
1364 return 0;
1367 static void print_summary(const char *prefix, const unsigned char *sha1,
1368 int initial_commit)
1370 struct rev_info rev;
1371 struct commit *commit;
1372 struct strbuf format = STRBUF_INIT;
1373 unsigned char junk_sha1[20];
1374 const char *head;
1375 struct pretty_print_context pctx = {0};
1376 struct strbuf author_ident = STRBUF_INIT;
1377 struct strbuf committer_ident = STRBUF_INIT;
1379 commit = lookup_commit(sha1);
1380 if (!commit)
1381 die(_("couldn't look up newly created commit"));
1382 if (parse_commit(commit))
1383 die(_("could not parse newly created commit"));
1385 strbuf_addstr(&format, "format:%h] %s");
1387 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1388 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1389 if (strbuf_cmp(&author_ident, &committer_ident)) {
1390 strbuf_addstr(&format, "\n Author: ");
1391 strbuf_addbuf_percentquote(&format, &author_ident);
1393 if (author_date_is_interesting()) {
1394 struct strbuf date = STRBUF_INIT;
1395 format_commit_message(commit, "%ad", &date, &pctx);
1396 strbuf_addstr(&format, "\n Date: ");
1397 strbuf_addbuf_percentquote(&format, &date);
1398 strbuf_release(&date);
1400 if (!committer_ident_sufficiently_given()) {
1401 strbuf_addstr(&format, "\n Committer: ");
1402 strbuf_addbuf_percentquote(&format, &committer_ident);
1403 if (advice_implicit_identity) {
1404 strbuf_addch(&format, '\n');
1405 strbuf_addstr(&format, _(implicit_ident_advice));
1408 strbuf_release(&author_ident);
1409 strbuf_release(&committer_ident);
1411 init_revisions(&rev, prefix);
1412 setup_revisions(0, NULL, &rev, NULL);
1414 rev.diff = 1;
1415 rev.diffopt.output_format =
1416 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1418 rev.verbose_header = 1;
1419 rev.show_root_diff = 1;
1420 get_commit_format(format.buf, &rev);
1421 rev.always_show_header = 0;
1422 rev.diffopt.detect_rename = 1;
1423 rev.diffopt.break_opt = 0;
1424 diff_setup_done(&rev.diffopt);
1426 head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1427 printf("[%s%s ",
1428 starts_with(head, "refs/heads/") ?
1429 head + 11 :
1430 !strcmp(head, "HEAD") ?
1431 _("detached HEAD") :
1432 head,
1433 initial_commit ? _(" (root-commit)") : "");
1435 if (!log_tree_commit(&rev, commit)) {
1436 rev.always_show_header = 1;
1437 rev.use_terminator = 1;
1438 log_tree_commit(&rev, commit);
1441 strbuf_release(&format);
1444 static int git_commit_config(const char *k, const char *v, void *cb)
1446 struct wt_status *s = cb;
1447 int status;
1449 if (!strcmp(k, "commit.template"))
1450 return git_config_pathname(&template_file, k, v);
1451 if (!strcmp(k, "commit.status")) {
1452 include_status = git_config_bool(k, v);
1453 return 0;
1455 if (!strcmp(k, "commit.cleanup"))
1456 return git_config_string(&cleanup_arg, k, v);
1457 if (!strcmp(k, "commit.gpgsign")) {
1458 sign_commit = git_config_bool(k, v) ? "" : NULL;
1459 return 0;
1462 status = git_gpg_config(k, v, NULL);
1463 if (status)
1464 return status;
1465 return git_status_config(k, v, s);
1468 static int run_rewrite_hook(const unsigned char *oldsha1,
1469 const unsigned char *newsha1)
1471 /* oldsha1 SP newsha1 LF NUL */
1472 static char buf[2*40 + 3];
1473 struct child_process proc;
1474 const char *argv[3];
1475 int code;
1476 size_t n;
1478 argv[0] = find_hook("post-rewrite");
1479 if (!argv[0])
1480 return 0;
1482 argv[1] = "amend";
1483 argv[2] = NULL;
1485 memset(&proc, 0, sizeof(proc));
1486 proc.argv = argv;
1487 proc.in = -1;
1488 proc.stdout_to_stderr = 1;
1490 code = start_command(&proc);
1491 if (code)
1492 return code;
1493 n = snprintf(buf, sizeof(buf), "%s %s\n",
1494 sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
1495 write_in_full(proc.in, buf, n);
1496 close(proc.in);
1497 return finish_command(&proc);
1500 int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
1502 const char *hook_env[3] = { NULL };
1503 char index[PATH_MAX];
1504 va_list args;
1505 int ret;
1507 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
1508 hook_env[0] = index;
1511 * Let the hook know that no editor will be launched.
1513 if (!editor_is_used)
1514 hook_env[1] = "GIT_EDITOR=:";
1516 va_start(args, name);
1517 ret = run_hook_ve(hook_env, name, args);
1518 va_end(args);
1520 return ret;
1523 int cmd_commit(int argc, const char **argv, const char *prefix)
1525 static struct wt_status s;
1526 static struct option builtin_commit_options[] = {
1527 OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
1528 OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
1530 OPT_GROUP(N_("Commit message options")),
1531 OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
1532 OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
1533 OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
1534 OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
1535 OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
1536 OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
1537 OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
1538 OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
1539 OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
1540 OPT_BOOL('s', "signoff", &signoff, N_("add Signed-off-by:")),
1541 OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
1542 OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
1543 OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
1544 OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
1545 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
1546 N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
1547 /* end commit message options */
1549 OPT_GROUP(N_("Commit contents options")),
1550 OPT_BOOL('a', "all", &all, N_("commit all changed files")),
1551 OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")),
1552 OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
1553 OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
1554 OPT_BOOL('o', "only", &only, N_("commit only specified files")),
1555 OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit hook")),
1556 OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),
1557 OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
1558 STATUS_FORMAT_SHORT),
1559 OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
1560 OPT_SET_INT(0, "porcelain", &status_format,
1561 N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
1562 OPT_SET_INT(0, "long", &status_format,
1563 N_("show status in long format (default)"),
1564 STATUS_FORMAT_LONG),
1565 OPT_BOOL('z', "null", &s.null_termination,
1566 N_("terminate entries with NUL")),
1567 OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
1568 OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
1569 { 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" },
1570 /* end commit contents options */
1572 OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
1573 N_("ok to record an empty change")),
1574 OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message,
1575 N_("ok to record a change with an empty message")),
1577 OPT_END()
1580 struct strbuf sb = STRBUF_INIT;
1581 struct strbuf author_ident = STRBUF_INIT;
1582 const char *index_file, *reflog_msg;
1583 char *nl;
1584 unsigned char sha1[20];
1585 struct ref_lock *ref_lock;
1586 struct commit_list *parents = NULL, **pptr = &parents;
1587 struct stat statbuf;
1588 struct commit *current_head = NULL;
1589 struct commit_extra_header *extra = NULL;
1591 if (argc == 2 && !strcmp(argv[1], "-h"))
1592 usage_with_options(builtin_commit_usage, builtin_commit_options);
1594 status_init_config(&s, git_commit_config);
1595 status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
1596 s.colopts = 0;
1598 if (get_sha1("HEAD", sha1))
1599 current_head = NULL;
1600 else {
1601 current_head = lookup_commit_or_die(sha1, "HEAD");
1602 if (parse_commit(current_head))
1603 die(_("could not parse HEAD commit"));
1605 argc = parse_and_validate_options(argc, argv, builtin_commit_options,
1606 builtin_commit_usage,
1607 prefix, current_head, &s);
1608 if (dry_run)
1609 return dry_run_commit(argc, argv, prefix, current_head, &s);
1610 index_file = prepare_index(argc, argv, prefix, current_head, 0);
1612 /* Set up everything for writing the commit object. This includes
1613 running hooks, writing the trees, and interacting with the user. */
1614 if (!prepare_to_commit(index_file, prefix,
1615 current_head, &s, &author_ident)) {
1616 rollback_index_files();
1617 return 1;
1620 /* Determine parents */
1621 reflog_msg = getenv("GIT_REFLOG_ACTION");
1622 if (!current_head) {
1623 if (!reflog_msg)
1624 reflog_msg = "commit (initial)";
1625 } else if (amend) {
1626 struct commit_list *c;
1628 if (!reflog_msg)
1629 reflog_msg = "commit (amend)";
1630 for (c = current_head->parents; c; c = c->next)
1631 pptr = &commit_list_insert(c->item, pptr)->next;
1632 } else if (whence == FROM_MERGE) {
1633 struct strbuf m = STRBUF_INIT;
1634 FILE *fp;
1635 int allow_fast_forward = 1;
1637 if (!reflog_msg)
1638 reflog_msg = "commit (merge)";
1639 pptr = &commit_list_insert(current_head, pptr)->next;
1640 fp = fopen(git_path("MERGE_HEAD"), "r");
1641 if (fp == NULL)
1642 die_errno(_("could not open '%s' for reading"),
1643 git_path("MERGE_HEAD"));
1644 while (strbuf_getline(&m, fp, '\n') != EOF) {
1645 struct commit *parent;
1647 parent = get_merge_parent(m.buf);
1648 if (!parent)
1649 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1650 pptr = &commit_list_insert(parent, pptr)->next;
1652 fclose(fp);
1653 strbuf_release(&m);
1654 if (!stat(git_path("MERGE_MODE"), &statbuf)) {
1655 if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1656 die_errno(_("could not read MERGE_MODE"));
1657 if (!strcmp(sb.buf, "no-ff"))
1658 allow_fast_forward = 0;
1660 if (allow_fast_forward)
1661 parents = reduce_heads(parents);
1662 } else {
1663 if (!reflog_msg)
1664 reflog_msg = (whence == FROM_CHERRY_PICK)
1665 ? "commit (cherry-pick)"
1666 : "commit";
1667 pptr = &commit_list_insert(current_head, pptr)->next;
1670 /* Finally, get the commit message */
1671 strbuf_reset(&sb);
1672 if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1673 int saved_errno = errno;
1674 rollback_index_files();
1675 die(_("could not read commit message: %s"), strerror(saved_errno));
1678 if (verbose || /* Truncate the message just before the diff, if any. */
1679 cleanup_mode == CLEANUP_SCISSORS)
1680 wt_status_truncate_message_at_cut_line(&sb);
1682 if (cleanup_mode != CLEANUP_NONE)
1683 stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1684 if (template_untouched(&sb) && !allow_empty_message) {
1685 rollback_index_files();
1686 fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
1687 exit(1);
1689 if (message_is_empty(&sb) && !allow_empty_message) {
1690 rollback_index_files();
1691 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
1692 exit(1);
1695 if (amend) {
1696 const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1697 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1698 } else {
1699 struct commit_extra_header **tail = &extra;
1700 append_merge_tag_headers(parents, &tail);
1703 if (commit_tree_extended(&sb, active_cache_tree->sha1, parents, sha1,
1704 author_ident.buf, sign_commit, extra)) {
1705 rollback_index_files();
1706 die(_("failed to write commit object"));
1708 strbuf_release(&author_ident);
1709 free_commit_extra_headers(extra);
1711 ref_lock = lock_any_ref_for_update("HEAD",
1712 !current_head
1713 ? NULL
1714 : current_head->object.sha1,
1715 0, NULL);
1717 nl = strchr(sb.buf, '\n');
1718 if (nl)
1719 strbuf_setlen(&sb, nl + 1 - sb.buf);
1720 else
1721 strbuf_addch(&sb, '\n');
1722 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1723 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1725 if (!ref_lock) {
1726 rollback_index_files();
1727 die(_("cannot lock HEAD ref"));
1729 if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1730 rollback_index_files();
1731 die(_("cannot update HEAD ref"));
1734 unlink(git_path("CHERRY_PICK_HEAD"));
1735 unlink(git_path("REVERT_HEAD"));
1736 unlink(git_path("MERGE_HEAD"));
1737 unlink(git_path("MERGE_MSG"));
1738 unlink(git_path("MERGE_MODE"));
1739 unlink(git_path("SQUASH_MSG"));
1741 if (commit_index_files())
1742 die (_("Repository has been updated, but unable to write\n"
1743 "new_index file. Check that disk is not full or quota is\n"
1744 "not exceeded, and then \"git reset HEAD\" to recover."));
1746 rerere(0);
1747 run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
1748 if (amend && !no_post_rewrite) {
1749 struct notes_rewrite_cfg *cfg;
1750 cfg = init_copy_notes_for_rewrite("amend");
1751 if (cfg) {
1752 /* we are amending, so current_head is not NULL */
1753 copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1754 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1756 run_rewrite_hook(current_head->object.sha1, sha1);
1758 if (!quiet)
1759 print_summary(prefix, sha1, !current_head);
1761 return 0;