1/*
2 * Builtin "git commit"
3 *
4 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
5 * Based on git-commit.sh by Junio C Hamano and Linus Torvalds
6 */
7
8#include "cache.h"
9#include "lockfile.h"
10#include "cache-tree.h"
11#include "color.h"
12#include "dir.h"
13#include "builtin.h"
14#include "diff.h"
15#include "diffcore.h"
16#include "commit.h"
17#include "revision.h"
18#include "wt-status.h"
19#include "run-command.h"
20#include "refs.h"
21#include "log-tree.h"
22#include "strbuf.h"
23#include "utf8.h"
24#include "parse-options.h"
25#include "string-list.h"
26#include "rerere.h"
27#include "unpack-trees.h"
28#include "quote.h"
29#include "submodule.h"
30#include "gpg-interface.h"
31#include "column.h"
32#include "sequencer.h"
33#include "notes-utils.h"
34#include "mailmap.h"
35#include "sigchain.h"
36
37static const char * const builtin_commit_usage[] = {
38 N_("git commit [<options>] [--] <pathspec>..."),
39 NULL
40};
41
42static const char * const builtin_status_usage[] = {
43 N_("git status [<options>] [--] <pathspec>..."),
44 NULL
45};
46
47static const char implicit_ident_advice_noconfig[] =
48N_("Your name and email address were configured automatically based\n"
49"on your username and hostname. Please check that they are accurate.\n"
50"You can suppress this message by setting them explicitly. Run the\n"
51"following command and follow the instructions in your editor to edit\n"
52"your configuration file:\n"
53"\n"
54" git config --global --edit\n"
55"\n"
56"After doing this, you may fix the identity used for this commit with:\n"
57"\n"
58" git commit --amend --reset-author\n");
59
60static const char implicit_ident_advice_config[] =
61N_("Your name and email address were configured automatically based\n"
62"on your username and hostname. Please check that they are accurate.\n"
63"You can suppress this message by setting them explicitly:\n"
64"\n"
65" git config --global user.name \"Your Name\"\n"
66" git config --global user.email you@example.com\n"
67"\n"
68"After doing this, you may fix the identity used for this commit with:\n"
69"\n"
70" git commit --amend --reset-author\n");
71
72static const char empty_amend_advice[] =
73N_("You asked to amend the most recent commit, but doing so would make\n"
74"it empty. You can repeat your command with --allow-empty, or you can\n"
75"remove the commit entirely with \"git reset HEAD^\".\n");
76
77static const char empty_cherry_pick_advice[] =
78N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
79"If you wish to commit it anyway, use:\n"
80"\n"
81" git commit --allow-empty\n"
82"\n");
83
84static const char empty_cherry_pick_advice_single[] =
85N_("Otherwise, please use 'git reset'\n");
86
87static const char empty_cherry_pick_advice_multi[] =
88N_("If you wish to skip this commit, use:\n"
89"\n"
90" git reset\n"
91"\n"
92"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
93"the remaining commits.\n");
94
95static GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
96
97static const char *use_message_buffer;
98static struct lock_file index_lock; /* real index */
99static struct lock_file false_lock; /* used only for partial commits */
100static enum {
101 COMMIT_AS_IS = 1,
102 COMMIT_NORMAL,
103 COMMIT_PARTIAL
104} commit_style;
105
106static const char *logfile, *force_author;
107static const char *template_file;
108/*
109 * The _message variables are commit names from which to take
110 * the commit message and/or authorship.
111 */
112static const char *author_message, *author_message_buffer;
113static char *edit_message, *use_message;
114static char *fixup_message, *squash_message;
115static int all, also, interactive, patch_interactive, only, amend, signoff;
116static int edit_flag = -1; /* unspecified */
117static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
118static int config_commit_verbose = -1; /* unspecified */
119static int no_post_rewrite, allow_empty_message;
120static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
121static char *sign_commit;
122
123/*
124 * The default commit message cleanup mode will remove the lines
125 * beginning with # (shell comments) and leading and trailing
126 * whitespaces (empty lines or containing only whitespaces)
127 * if editor is used, and only the whitespaces if the message
128 * is specified explicitly.
129 */
130static enum {
131 CLEANUP_SPACE,
132 CLEANUP_NONE,
133 CLEANUP_SCISSORS,
134 CLEANUP_ALL
135} cleanup_mode;
136static const char *cleanup_arg;
137
138static enum commit_whence whence;
139static int sequencer_in_use;
140static int use_editor = 1, include_status = 1;
141static int show_ignored_in_status, have_option_m;
142static struct strbuf message = STRBUF_INIT;
143
144static enum wt_status_format status_format = STATUS_FORMAT_UNSPECIFIED;
145
146static int opt_parse_porcelain(const struct option *opt, const char *arg, int unset)
147{
148 enum wt_status_format *value = (enum wt_status_format *)opt->value;
149 if (unset)
150 *value = STATUS_FORMAT_NONE;
151 else if (!arg)
152 *value = STATUS_FORMAT_PORCELAIN;
153 else if (!strcmp(arg, "v1") || !strcmp(arg, "1"))
154 *value = STATUS_FORMAT_PORCELAIN;
155 else if (!strcmp(arg, "v2") || !strcmp(arg, "2"))
156 *value = STATUS_FORMAT_PORCELAIN_V2;
157 else
158 die("unsupported porcelain version '%s'", arg);
159
160 return 0;
161}
162
163static int opt_parse_m(const struct option *opt, const char *arg, int unset)
164{
165 struct strbuf *buf = opt->value;
166 if (unset) {
167 have_option_m = 0;
168 strbuf_setlen(buf, 0);
169 } else {
170 have_option_m = 1;
171 if (buf->len)
172 strbuf_addch(buf, '\n');
173 strbuf_addstr(buf, arg);
174 strbuf_complete_line(buf);
175 }
176 return 0;
177}
178
179static void determine_whence(struct wt_status *s)
180{
181 if (file_exists(git_path_merge_head()))
182 whence = FROM_MERGE;
183 else if (file_exists(git_path_cherry_pick_head())) {
184 whence = FROM_CHERRY_PICK;
185 if (file_exists(git_path_seq_dir()))
186 sequencer_in_use = 1;
187 }
188 else
189 whence = FROM_COMMIT;
190 if (s)
191 s->whence = whence;
192}
193
194static void status_init_config(struct wt_status *s, config_fn_t fn)
195{
196 wt_status_prepare(s);
197 gitmodules_config();
198 git_config(fn, s);
199 determine_whence(s);
200 init_diff_ui_defaults();
201 s->hints = advice_status_hints; /* must come after git_config() */
202}
203
204static void rollback_index_files(void)
205{
206 switch (commit_style) {
207 case COMMIT_AS_IS:
208 break; /* nothing to do */
209 case COMMIT_NORMAL:
210 rollback_lock_file(&index_lock);
211 break;
212 case COMMIT_PARTIAL:
213 rollback_lock_file(&index_lock);
214 rollback_lock_file(&false_lock);
215 break;
216 }
217}
218
219static int commit_index_files(void)
220{
221 int err = 0;
222
223 switch (commit_style) {
224 case COMMIT_AS_IS:
225 break; /* nothing to do */
226 case COMMIT_NORMAL:
227 err = commit_lock_file(&index_lock);
228 break;
229 case COMMIT_PARTIAL:
230 err = commit_lock_file(&index_lock);
231 rollback_lock_file(&false_lock);
232 break;
233 }
234
235 return err;
236}
237
238/*
239 * Take a union of paths in the index and the named tree (typically, "HEAD"),
240 * and return the paths that match the given pattern in list.
241 */
242static int list_paths(struct string_list *list, const char *with_tree,
243 const char *prefix, const struct pathspec *pattern)
244{
245 int i, ret;
246 char *m;
247
248 if (!pattern->nr)
249 return 0;
250
251 m = xcalloc(1, pattern->nr);
252
253 if (with_tree) {
254 char *max_prefix = common_prefix(pattern);
255 overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
256 free(max_prefix);
257 }
258
259 for (i = 0; i < active_nr; i++) {
260 const struct cache_entry *ce = active_cache[i];
261 struct string_list_item *item;
262
263 if (ce->ce_flags & CE_UPDATE)
264 continue;
265 if (!ce_path_match(ce, pattern, m))
266 continue;
267 item = string_list_insert(list, ce->name);
268 if (ce_skip_worktree(ce))
269 item->util = item; /* better a valid pointer than a fake one */
270 }
271
272 ret = report_path_error(m, pattern, prefix);
273 free(m);
274 return ret;
275}
276
277static void add_remove_files(struct string_list *list)
278{
279 int i;
280 for (i = 0; i < list->nr; i++) {
281 struct stat st;
282 struct string_list_item *p = &(list->items[i]);
283
284 /* p->util is skip-worktree */
285 if (p->util)
286 continue;
287
288 if (!lstat(p->string, &st)) {
289 if (add_to_cache(p->string, &st, 0))
290 die(_("updating files failed"));
291 } else
292 remove_file_from_cache(p->string);
293 }
294}
295
296static void create_base_index(const struct commit *current_head)
297{
298 struct tree *tree;
299 struct unpack_trees_options opts;
300 struct tree_desc t;
301
302 if (!current_head) {
303 discard_cache();
304 return;
305 }
306
307 memset(&opts, 0, sizeof(opts));
308 opts.head_idx = 1;
309 opts.index_only = 1;
310 opts.merge = 1;
311 opts.src_index = &the_index;
312 opts.dst_index = &the_index;
313
314 opts.fn = oneway_merge;
315 tree = parse_tree_indirect(current_head->object.oid.hash);
316 if (!tree)
317 die(_("failed to unpack HEAD tree object"));
318 parse_tree(tree);
319 init_tree_desc(&t, tree->buffer, tree->size);
320 if (unpack_trees(1, &t, &opts))
321 exit(128); /* We've already reported the error, finish dying */
322}
323
324static void refresh_cache_or_die(int refresh_flags)
325{
326 /*
327 * refresh_flags contains REFRESH_QUIET, so the only errors
328 * are for unmerged entries.
329 */
330 if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
331 die_resolve_conflict("commit");
332}
333
334static const char *prepare_index(int argc, const char **argv, const char *prefix,
335 const struct commit *current_head, int is_status)
336{
337 struct string_list partial;
338 struct pathspec pathspec;
339 int refresh_flags = REFRESH_QUIET;
340 const char *ret;
341
342 if (is_status)
343 refresh_flags |= REFRESH_UNMERGED;
344 parse_pathspec(&pathspec, 0,
345 PATHSPEC_PREFER_FULL,
346 prefix, argv);
347
348 if (read_cache_preload(&pathspec) < 0)
349 die(_("index file corrupt"));
350
351 if (interactive) {
352 char *old_index_env = NULL;
353 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
354
355 refresh_cache_or_die(refresh_flags);
356
357 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
358 die(_("unable to create temporary index"));
359
360 old_index_env = getenv(INDEX_ENVIRONMENT);
361 setenv(INDEX_ENVIRONMENT, get_lock_file_path(&index_lock), 1);
362
363 if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
364 die(_("interactive add failed"));
365
366 if (old_index_env && *old_index_env)
367 setenv(INDEX_ENVIRONMENT, old_index_env, 1);
368 else
369 unsetenv(INDEX_ENVIRONMENT);
370
371 discard_cache();
372 read_cache_from(get_lock_file_path(&index_lock));
373 if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) {
374 if (reopen_lock_file(&index_lock) < 0)
375 die(_("unable to write index file"));
376 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
377 die(_("unable to update temporary index"));
378 } else
379 warning(_("Failed to update main cache tree"));
380
381 commit_style = COMMIT_NORMAL;
382 return get_lock_file_path(&index_lock);
383 }
384
385 /*
386 * Non partial, non as-is commit.
387 *
388 * (1) get the real index;
389 * (2) update the_index as necessary;
390 * (3) write the_index out to the real index (still locked);
391 * (4) return the name of the locked index file.
392 *
393 * The caller should run hooks on the locked real index, and
394 * (A) if all goes well, commit the real index;
395 * (B) on failure, rollback the real index.
396 */
397 if (all || (also && pathspec.nr)) {
398 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
399 add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
400 refresh_cache_or_die(refresh_flags);
401 update_main_cache_tree(WRITE_TREE_SILENT);
402 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
403 die(_("unable to write new_index file"));
404 commit_style = COMMIT_NORMAL;
405 return get_lock_file_path(&index_lock);
406 }
407
408 /*
409 * As-is commit.
410 *
411 * (1) return the name of the real index file.
412 *
413 * The caller should run hooks on the real index,
414 * and create commit from the_index.
415 * We still need to refresh the index here.
416 */
417 if (!only && !pathspec.nr) {
418 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
419 refresh_cache_or_die(refresh_flags);
420 if (active_cache_changed
421 || !cache_tree_fully_valid(active_cache_tree))
422 update_main_cache_tree(WRITE_TREE_SILENT);
423 if (active_cache_changed) {
424 if (write_locked_index(&the_index, &index_lock,
425 COMMIT_LOCK))
426 die(_("unable to write new_index file"));
427 } else {
428 rollback_lock_file(&index_lock);
429 }
430 commit_style = COMMIT_AS_IS;
431 return get_index_file();
432 }
433
434 /*
435 * A partial commit.
436 *
437 * (0) find the set of affected paths;
438 * (1) get lock on the real index file;
439 * (2) update the_index with the given paths;
440 * (3) write the_index out to the real index (still locked);
441 * (4) get lock on the false index file;
442 * (5) reset the_index from HEAD;
443 * (6) update the_index the same way as (2);
444 * (7) write the_index out to the false index file;
445 * (8) return the name of the false index file (still locked);
446 *
447 * The caller should run hooks on the locked false index, and
448 * create commit from it. Then
449 * (A) if all goes well, commit the real index;
450 * (B) on failure, rollback the real index;
451 * In either case, rollback the false index.
452 */
453 commit_style = COMMIT_PARTIAL;
454
455 if (whence != FROM_COMMIT) {
456 if (whence == FROM_MERGE)
457 die(_("cannot do a partial commit during a merge."));
458 else if (whence == FROM_CHERRY_PICK)
459 die(_("cannot do a partial commit during a cherry-pick."));
460 }
461
462 string_list_init(&partial, 1);
463 if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
464 exit(1);
465
466 discard_cache();
467 if (read_cache() < 0)
468 die(_("cannot read the index"));
469
470 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
471 add_remove_files(&partial);
472 refresh_cache(REFRESH_QUIET);
473 update_main_cache_tree(WRITE_TREE_SILENT);
474 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
475 die(_("unable to write new_index file"));
476
477 hold_lock_file_for_update(&false_lock,
478 git_path("next-index-%"PRIuMAX,
479 (uintmax_t) getpid()),
480 LOCK_DIE_ON_ERROR);
481
482 create_base_index(current_head);
483 add_remove_files(&partial);
484 refresh_cache(REFRESH_QUIET);
485
486 if (write_locked_index(&the_index, &false_lock, CLOSE_LOCK))
487 die(_("unable to write temporary index file"));
488
489 discard_cache();
490 ret = get_lock_file_path(&false_lock);
491 read_cache_from(ret);
492 return ret;
493}
494
495static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
496 struct wt_status *s)
497{
498 struct object_id oid;
499
500 if (s->relative_paths)
501 s->prefix = prefix;
502
503 if (amend) {
504 s->amend = 1;
505 s->reference = "HEAD^1";
506 }
507 s->verbose = verbose;
508 s->index_file = index_file;
509 s->fp = fp;
510 s->nowarn = nowarn;
511 s->is_initial = get_sha1(s->reference, oid.hash) ? 1 : 0;
512 if (!s->is_initial)
513 hashcpy(s->sha1_commit, oid.hash);
514 s->status_format = status_format;
515 s->ignore_submodule_arg = ignore_submodule_arg;
516
517 wt_status_collect(s);
518 wt_status_print(s);
519
520 return s->commitable;
521}
522
523static int is_a_merge(const struct commit *current_head)
524{
525 return !!(current_head->parents && current_head->parents->next);
526}
527
528static void assert_split_ident(struct ident_split *id, const struct strbuf *buf)
529{
530 if (split_ident_line(id, buf->buf, buf->len) || !id->date_begin)
531 die("BUG: unable to parse our own ident: %s", buf->buf);
532}
533
534static void export_one(const char *var, const char *s, const char *e, int hack)
535{
536 struct strbuf buf = STRBUF_INIT;
537 if (hack)
538 strbuf_addch(&buf, hack);
539 strbuf_addf(&buf, "%.*s", (int)(e - s), s);
540 setenv(var, buf.buf, 1);
541 strbuf_release(&buf);
542}
543
544static int parse_force_date(const char *in, struct strbuf *out)
545{
546 strbuf_addch(out, '@');
547
548 if (parse_date(in, out) < 0) {
549 int errors = 0;
550 unsigned long t = approxidate_careful(in, &errors);
551 if (errors)
552 return -1;
553 strbuf_addf(out, "%lu", t);
554 }
555
556 return 0;
557}
558
559static void set_ident_var(char **buf, char *val)
560{
561 free(*buf);
562 *buf = val;
563}
564
565static void determine_author_info(struct strbuf *author_ident)
566{
567 char *name, *email, *date;
568 struct ident_split author;
569
570 name = xstrdup_or_null(getenv("GIT_AUTHOR_NAME"));
571 email = xstrdup_or_null(getenv("GIT_AUTHOR_EMAIL"));
572 date = xstrdup_or_null(getenv("GIT_AUTHOR_DATE"));
573
574 if (author_message) {
575 struct ident_split ident;
576 size_t len;
577 const char *a;
578
579 a = find_commit_header(author_message_buffer, "author", &len);
580 if (!a)
581 die(_("commit '%s' lacks author header"), author_message);
582 if (split_ident_line(&ident, a, len) < 0)
583 die(_("commit '%s' has malformed author line"), author_message);
584
585 set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
586 set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
587
588 if (ident.date_begin) {
589 struct strbuf date_buf = STRBUF_INIT;
590 strbuf_addch(&date_buf, '@');
591 strbuf_add(&date_buf, ident.date_begin, ident.date_end - ident.date_begin);
592 strbuf_addch(&date_buf, ' ');
593 strbuf_add(&date_buf, ident.tz_begin, ident.tz_end - ident.tz_begin);
594 set_ident_var(&date, strbuf_detach(&date_buf, NULL));
595 }
596 }
597
598 if (force_author) {
599 struct ident_split ident;
600
601 if (split_ident_line(&ident, force_author, strlen(force_author)) < 0)
602 die(_("malformed --author parameter"));
603 set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
604 set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
605 }
606
607 if (force_date) {
608 struct strbuf date_buf = STRBUF_INIT;
609 if (parse_force_date(force_date, &date_buf))
610 die(_("invalid date format: %s"), force_date);
611 set_ident_var(&date, strbuf_detach(&date_buf, NULL));
612 }
613
614 strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
615 assert_split_ident(&author, author_ident);
616 export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
617 export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
618 export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
619 free(name);
620 free(email);
621 free(date);
622}
623
624static int author_date_is_interesting(void)
625{
626 return author_message || force_date;
627}
628
629static void adjust_comment_line_char(const struct strbuf *sb)
630{
631 char candidates[] = "#;@!$%^&|:";
632 char *candidate;
633 const char *p;
634
635 comment_line_char = candidates[0];
636 if (!memchr(sb->buf, comment_line_char, sb->len))
637 return;
638
639 p = sb->buf;
640 candidate = strchr(candidates, *p);
641 if (candidate)
642 *candidate = ' ';
643 for (p = sb->buf; *p; p++) {
644 if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
645 candidate = strchr(candidates, p[1]);
646 if (candidate)
647 *candidate = ' ';
648 }
649 }
650
651 for (p = candidates; *p == ' '; p++)
652 ;
653 if (!*p)
654 die(_("unable to select a comment character that is not used\n"
655 "in the current commit message"));
656 comment_line_char = *p;
657}
658
659static int prepare_to_commit(const char *index_file, const char *prefix,
660 struct commit *current_head,
661 struct wt_status *s,
662 struct strbuf *author_ident)
663{
664 struct stat statbuf;
665 struct strbuf committer_ident = STRBUF_INIT;
666 int commitable;
667 struct strbuf sb = STRBUF_INIT;
668 const char *hook_arg1 = NULL;
669 const char *hook_arg2 = NULL;
670 int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
671 int old_display_comment_prefix;
672
673 /* This checks and barfs if author is badly specified */
674 determine_author_info(author_ident);
675
676 if (!no_verify && run_commit_hook(use_editor, index_file, "pre-commit", NULL))
677 return 0;
678
679 if (squash_message) {
680 /*
681 * Insert the proper subject line before other commit
682 * message options add their content.
683 */
684 if (use_message && !strcmp(use_message, squash_message))
685 strbuf_addstr(&sb, "squash! ");
686 else {
687 struct pretty_print_context ctx = {0};
688 struct commit *c;
689 c = lookup_commit_reference_by_name(squash_message);
690 if (!c)
691 die(_("could not lookup commit %s"), squash_message);
692 ctx.output_encoding = get_commit_output_encoding();
693 format_commit_message(c, "squash! %s\n\n", &sb,
694 &ctx);
695 }
696 }
697
698 if (have_option_m) {
699 strbuf_addbuf(&sb, &message);
700 hook_arg1 = "message";
701 } else if (logfile && !strcmp(logfile, "-")) {
702 if (isatty(0))
703 fprintf(stderr, _("(reading log message from standard input)\n"));
704 if (strbuf_read(&sb, 0, 0) < 0)
705 die_errno(_("could not read log from standard input"));
706 hook_arg1 = "message";
707 } else if (logfile) {
708 if (strbuf_read_file(&sb, logfile, 0) < 0)
709 die_errno(_("could not read log file '%s'"),
710 logfile);
711 hook_arg1 = "message";
712 } else if (use_message) {
713 char *buffer;
714 buffer = strstr(use_message_buffer, "\n\n");
715 if (buffer)
716 strbuf_addstr(&sb, skip_blank_lines(buffer + 2));
717 hook_arg1 = "commit";
718 hook_arg2 = use_message;
719 } else if (fixup_message) {
720 struct pretty_print_context ctx = {0};
721 struct commit *commit;
722 commit = lookup_commit_reference_by_name(fixup_message);
723 if (!commit)
724 die(_("could not lookup commit %s"), fixup_message);
725 ctx.output_encoding = get_commit_output_encoding();
726 format_commit_message(commit, "fixup! %s\n\n",
727 &sb, &ctx);
728 hook_arg1 = "message";
729 } else if (!stat(git_path_merge_msg(), &statbuf)) {
730 /*
731 * prepend SQUASH_MSG here if it exists and a
732 * "merge --squash" was originally performed
733 */
734 if (!stat(git_path_squash_msg(), &statbuf)) {
735 if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
736 die_errno(_("could not read SQUASH_MSG"));
737 hook_arg1 = "squash";
738 } else
739 hook_arg1 = "merge";
740 if (strbuf_read_file(&sb, git_path_merge_msg(), 0) < 0)
741 die_errno(_("could not read MERGE_MSG"));
742 } else if (!stat(git_path_squash_msg(), &statbuf)) {
743 if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
744 die_errno(_("could not read SQUASH_MSG"));
745 hook_arg1 = "squash";
746 } else if (template_file) {
747 if (strbuf_read_file(&sb, template_file, 0) < 0)
748 die_errno(_("could not read '%s'"), template_file);
749 hook_arg1 = "template";
750 clean_message_contents = 0;
751 }
752
753 /*
754 * The remaining cases don't modify the template message, but
755 * just set the argument(s) to the prepare-commit-msg hook.
756 */
757 else if (whence == FROM_MERGE)
758 hook_arg1 = "merge";
759 else if (whence == FROM_CHERRY_PICK) {
760 hook_arg1 = "commit";
761 hook_arg2 = "CHERRY_PICK_HEAD";
762 }
763
764 if (squash_message) {
765 /*
766 * If squash_commit was used for the commit subject,
767 * then we're possibly hijacking other commit log options.
768 * Reset the hook args to tell the real story.
769 */
770 hook_arg1 = "message";
771 hook_arg2 = "";
772 }
773
774 s->fp = fopen_for_writing(git_path_commit_editmsg());
775 if (s->fp == NULL)
776 die_errno(_("could not open '%s'"), git_path_commit_editmsg());
777
778 /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
779 old_display_comment_prefix = s->display_comment_prefix;
780 s->display_comment_prefix = 1;
781
782 /*
783 * Most hints are counter-productive when the commit has
784 * already started.
785 */
786 s->hints = 0;
787
788 if (clean_message_contents)
789 strbuf_stripspace(&sb, 0);
790
791 if (signoff)
792 append_signoff(&sb, ignore_non_trailer(sb.buf, sb.len), 0);
793
794 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
795 die_errno(_("could not write commit template"));
796
797 if (auto_comment_line_char)
798 adjust_comment_line_char(&sb);
799 strbuf_release(&sb);
800
801 /* This checks if committer ident is explicitly given */
802 strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
803 if (use_editor && include_status) {
804 int ident_shown = 0;
805 int saved_color_setting;
806 struct ident_split ci, ai;
807
808 if (whence != FROM_COMMIT) {
809 if (cleanup_mode == CLEANUP_SCISSORS)
810 wt_status_add_cut_line(s->fp);
811 status_printf_ln(s, GIT_COLOR_NORMAL,
812 whence == FROM_MERGE
813 ? _("\n"
814 "It looks like you may be committing a merge.\n"
815 "If this is not correct, please remove the file\n"
816 " %s\n"
817 "and try again.\n")
818 : _("\n"
819 "It looks like you may be committing a cherry-pick.\n"
820 "If this is not correct, please remove the file\n"
821 " %s\n"
822 "and try again.\n"),
823 whence == FROM_MERGE ?
824 git_path_merge_head() :
825 git_path_cherry_pick_head());
826 }
827
828 fprintf(s->fp, "\n");
829 if (cleanup_mode == CLEANUP_ALL)
830 status_printf(s, GIT_COLOR_NORMAL,
831 _("Please enter the commit message for your changes."
832 " Lines starting\nwith '%c' will be ignored, and an empty"
833 " message aborts the commit.\n"), comment_line_char);
834 else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
835 wt_status_add_cut_line(s->fp);
836 else /* CLEANUP_SPACE, that is. */
837 status_printf(s, GIT_COLOR_NORMAL,
838 _("Please enter the commit message for your changes."
839 " Lines starting\n"
840 "with '%c' will be kept; you may remove them"
841 " yourself if you want to.\n"
842 "An empty message aborts the commit.\n"), comment_line_char);
843
844 /*
845 * These should never fail because they come from our own
846 * fmt_ident. They may fail the sane_ident test, but we know
847 * that the name and mail pointers will at least be valid,
848 * which is enough for our tests and printing here.
849 */
850 assert_split_ident(&ai, author_ident);
851 assert_split_ident(&ci, &committer_ident);
852
853 if (ident_cmp(&ai, &ci))
854 status_printf_ln(s, GIT_COLOR_NORMAL,
855 _("%s"
856 "Author: %.*s <%.*s>"),
857 ident_shown++ ? "" : "\n",
858 (int)(ai.name_end - ai.name_begin), ai.name_begin,
859 (int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
860
861 if (author_date_is_interesting())
862 status_printf_ln(s, GIT_COLOR_NORMAL,
863 _("%s"
864 "Date: %s"),
865 ident_shown++ ? "" : "\n",
866 show_ident_date(&ai, DATE_MODE(NORMAL)));
867
868 if (!committer_ident_sufficiently_given())
869 status_printf_ln(s, GIT_COLOR_NORMAL,
870 _("%s"
871 "Committer: %.*s <%.*s>"),
872 ident_shown++ ? "" : "\n",
873 (int)(ci.name_end - ci.name_begin), ci.name_begin,
874 (int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
875
876 status_printf_ln(s, GIT_COLOR_NORMAL, "%s", ""); /* Add new line for clarity */
877
878 saved_color_setting = s->use_color;
879 s->use_color = 0;
880 commitable = run_status(s->fp, index_file, prefix, 1, s);
881 s->use_color = saved_color_setting;
882 } else {
883 struct object_id oid;
884 const char *parent = "HEAD";
885
886 if (!active_nr && read_cache() < 0)
887 die(_("Cannot read index"));
888
889 if (amend)
890 parent = "HEAD^1";
891
892 if (get_sha1(parent, oid.hash)) {
893 int i, ita_nr = 0;
894
895 for (i = 0; i < active_nr; i++)
896 if (ce_intent_to_add(active_cache[i]))
897 ita_nr++;
898 commitable = active_nr - ita_nr > 0;
899 } else {
900 /*
901 * Unless the user did explicitly request a submodule
902 * ignore mode by passing a command line option we do
903 * not ignore any changed submodule SHA-1s when
904 * comparing index and parent, no matter what is
905 * configured. Otherwise we won't commit any
906 * submodules which were manually staged, which would
907 * be really confusing.
908 */
909 int diff_flags = DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG;
910 if (ignore_submodule_arg &&
911 !strcmp(ignore_submodule_arg, "all"))
912 diff_flags |= DIFF_OPT_IGNORE_SUBMODULES;
913 commitable = index_differs_from(parent, diff_flags, 1);
914 }
915 }
916 strbuf_release(&committer_ident);
917
918 fclose(s->fp);
919
920 /*
921 * Reject an attempt to record a non-merge empty commit without
922 * explicit --allow-empty. In the cherry-pick case, it may be
923 * empty due to conflict resolution, which the user should okay.
924 */
925 if (!commitable && whence != FROM_MERGE && !allow_empty &&
926 !(amend && is_a_merge(current_head))) {
927 s->display_comment_prefix = old_display_comment_prefix;
928 run_status(stdout, index_file, prefix, 0, s);
929 if (amend)
930 fputs(_(empty_amend_advice), stderr);
931 else if (whence == FROM_CHERRY_PICK) {
932 fputs(_(empty_cherry_pick_advice), stderr);
933 if (!sequencer_in_use)
934 fputs(_(empty_cherry_pick_advice_single), stderr);
935 else
936 fputs(_(empty_cherry_pick_advice_multi), stderr);
937 }
938 return 0;
939 }
940
941 /*
942 * Re-read the index as pre-commit hook could have updated it,
943 * and write it out as a tree. We must do this before we invoke
944 * the editor and after we invoke run_status above.
945 */
946 discard_cache();
947 read_cache_from(index_file);
948 if (update_main_cache_tree(0)) {
949 error(_("Error building trees"));
950 return 0;
951 }
952
953 if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
954 git_path_commit_editmsg(), hook_arg1, hook_arg2, NULL))
955 return 0;
956
957 if (use_editor) {
958 struct argv_array env = ARGV_ARRAY_INIT;
959
960 argv_array_pushf(&env, "GIT_INDEX_FILE=%s", index_file);
961 if (launch_editor(git_path_commit_editmsg(), NULL, env.argv)) {
962 fprintf(stderr,
963 _("Please supply the message using either -m or -F option.\n"));
964 exit(1);
965 }
966 argv_array_clear(&env);
967 }
968
969 if (!no_verify &&
970 run_commit_hook(use_editor, index_file, "commit-msg", git_path_commit_editmsg(), NULL)) {
971 return 0;
972 }
973
974 return 1;
975}
976
977static int rest_is_empty(struct strbuf *sb, int start)
978{
979 int i, eol;
980 const char *nl;
981
982 /* Check if the rest is just whitespace and Signed-of-by's. */
983 for (i = start; i < sb->len; i++) {
984 nl = memchr(sb->buf + i, '\n', sb->len - i);
985 if (nl)
986 eol = nl - sb->buf;
987 else
988 eol = sb->len;
989
990 if (strlen(sign_off_header) <= eol - i &&
991 starts_with(sb->buf + i, sign_off_header)) {
992 i = eol;
993 continue;
994 }
995 while (i < eol)
996 if (!isspace(sb->buf[i++]))
997 return 0;
998 }
999
1000 return 1;
1001}
1002
1003/*
1004 * Find out if the message in the strbuf contains only whitespace and
1005 * Signed-off-by lines.
1006 */
1007static int message_is_empty(struct strbuf *sb)
1008{
1009 if (cleanup_mode == CLEANUP_NONE && sb->len)
1010 return 0;
1011 return rest_is_empty(sb, 0);
1012}
1013
1014/*
1015 * See if the user edited the message in the editor or left what
1016 * was in the template intact
1017 */
1018static int template_untouched(struct strbuf *sb)
1019{
1020 struct strbuf tmpl = STRBUF_INIT;
1021 const char *start;
1022
1023 if (cleanup_mode == CLEANUP_NONE && sb->len)
1024 return 0;
1025
1026 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1027 return 0;
1028
1029 strbuf_stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
1030 if (!skip_prefix(sb->buf, tmpl.buf, &start))
1031 start = sb->buf;
1032 strbuf_release(&tmpl);
1033 return rest_is_empty(sb, start - sb->buf);
1034}
1035
1036static const char *find_author_by_nickname(const char *name)
1037{
1038 struct rev_info revs;
1039 struct commit *commit;
1040 struct strbuf buf = STRBUF_INIT;
1041 struct string_list mailmap = STRING_LIST_INIT_NODUP;
1042 const char *av[20];
1043 int ac = 0;
1044
1045 init_revisions(&revs, NULL);
1046 strbuf_addf(&buf, "--author=%s", name);
1047 av[++ac] = "--all";
1048 av[++ac] = "-i";
1049 av[++ac] = buf.buf;
1050 av[++ac] = NULL;
1051 setup_revisions(ac, av, &revs, NULL);
1052 revs.mailmap = &mailmap;
1053 read_mailmap(revs.mailmap, NULL);
1054
1055 if (prepare_revision_walk(&revs))
1056 die(_("revision walk setup failed"));
1057 commit = get_revision(&revs);
1058 if (commit) {
1059 struct pretty_print_context ctx = {0};
1060 ctx.date_mode.type = DATE_NORMAL;
1061 strbuf_release(&buf);
1062 format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
1063 clear_mailmap(&mailmap);
1064 return strbuf_detach(&buf, NULL);
1065 }
1066 die(_("--author '%s' is not 'Name <email>' and matches no existing author"), name);
1067}
1068
1069
1070static void handle_untracked_files_arg(struct wt_status *s)
1071{
1072 if (!untracked_files_arg)
1073 ; /* default already initialized */
1074 else if (!strcmp(untracked_files_arg, "no"))
1075 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1076 else if (!strcmp(untracked_files_arg, "normal"))
1077 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1078 else if (!strcmp(untracked_files_arg, "all"))
1079 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1080 else
1081 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
1082}
1083
1084static const char *read_commit_message(const char *name)
1085{
1086 const char *out_enc;
1087 struct commit *commit;
1088
1089 commit = lookup_commit_reference_by_name(name);
1090 if (!commit)
1091 die(_("could not lookup commit %s"), name);
1092 out_enc = get_commit_output_encoding();
1093 return logmsg_reencode(commit, NULL, out_enc);
1094}
1095
1096/*
1097 * Enumerate what needs to be propagated when --porcelain
1098 * is not in effect here.
1099 */
1100static struct status_deferred_config {
1101 enum wt_status_format status_format;
1102 int show_branch;
1103} status_deferred_config = {
1104 STATUS_FORMAT_UNSPECIFIED,
1105 -1 /* unspecified */
1106};
1107
1108static void finalize_deferred_config(struct wt_status *s)
1109{
1110 int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
1111 status_format != STATUS_FORMAT_PORCELAIN_V2 &&
1112 !s->null_termination);
1113
1114 if (s->null_termination) {
1115 if (status_format == STATUS_FORMAT_NONE ||
1116 status_format == STATUS_FORMAT_UNSPECIFIED)
1117 status_format = STATUS_FORMAT_PORCELAIN;
1118 else if (status_format == STATUS_FORMAT_LONG)
1119 die(_("--long and -z are incompatible"));
1120 }
1121
1122 if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED)
1123 status_format = status_deferred_config.status_format;
1124 if (status_format == STATUS_FORMAT_UNSPECIFIED)
1125 status_format = STATUS_FORMAT_NONE;
1126
1127 if (use_deferred_config && s->show_branch < 0)
1128 s->show_branch = status_deferred_config.show_branch;
1129 if (s->show_branch < 0)
1130 s->show_branch = 0;
1131}
1132
1133static int parse_and_validate_options(int argc, const char *argv[],
1134 const struct option *options,
1135 const char * const usage[],
1136 const char *prefix,
1137 struct commit *current_head,
1138 struct wt_status *s)
1139{
1140 int f = 0;
1141
1142 argc = parse_options(argc, argv, prefix, options, usage, 0);
1143 finalize_deferred_config(s);
1144
1145 if (force_author && !strchr(force_author, '>'))
1146 force_author = find_author_by_nickname(force_author);
1147
1148 if (force_author && renew_authorship)
1149 die(_("Using both --reset-author and --author does not make sense"));
1150
1151 if (logfile || have_option_m || use_message || fixup_message)
1152 use_editor = 0;
1153 if (0 <= edit_flag)
1154 use_editor = edit_flag;
1155
1156 /* Sanity check options */
1157 if (amend && !current_head)
1158 die(_("You have nothing to amend."));
1159 if (amend && whence != FROM_COMMIT) {
1160 if (whence == FROM_MERGE)
1161 die(_("You are in the middle of a merge -- cannot amend."));
1162 else if (whence == FROM_CHERRY_PICK)
1163 die(_("You are in the middle of a cherry-pick -- cannot amend."));
1164 }
1165 if (fixup_message && squash_message)
1166 die(_("Options --squash and --fixup cannot be used together"));
1167 if (use_message)
1168 f++;
1169 if (edit_message)
1170 f++;
1171 if (fixup_message)
1172 f++;
1173 if (logfile)
1174 f++;
1175 if (f > 1)
1176 die(_("Only one of -c/-C/-F/--fixup can be used."));
1177 if (have_option_m && f > 0)
1178 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1179 if (f || have_option_m)
1180 template_file = NULL;
1181 if (edit_message)
1182 use_message = edit_message;
1183 if (amend && !use_message && !fixup_message)
1184 use_message = "HEAD";
1185 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1186 die(_("--reset-author can be used only with -C, -c or --amend."));
1187 if (use_message) {
1188 use_message_buffer = read_commit_message(use_message);
1189 if (!renew_authorship) {
1190 author_message = use_message;
1191 author_message_buffer = use_message_buffer;
1192 }
1193 }
1194 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1195 author_message = "CHERRY_PICK_HEAD";
1196 author_message_buffer = read_commit_message(author_message);
1197 }
1198
1199 if (patch_interactive)
1200 interactive = 1;
1201
1202 if (also + only + all + interactive > 1)
1203 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
1204 if (argc == 0 && (also || (only && !amend && !allow_empty)))
1205 die(_("No paths with --include/--only does not make sense."));
1206 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1207 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1208 else if (!strcmp(cleanup_arg, "verbatim"))
1209 cleanup_mode = CLEANUP_NONE;
1210 else if (!strcmp(cleanup_arg, "whitespace"))
1211 cleanup_mode = CLEANUP_SPACE;
1212 else if (!strcmp(cleanup_arg, "strip"))
1213 cleanup_mode = CLEANUP_ALL;
1214 else if (!strcmp(cleanup_arg, "scissors"))
1215 cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
1216 else
1217 die(_("Invalid cleanup mode %s"), cleanup_arg);
1218
1219 handle_untracked_files_arg(s);
1220
1221 if (all && argc > 0)
1222 die(_("Paths with -a does not make sense."));
1223
1224 if (status_format != STATUS_FORMAT_NONE)
1225 dry_run = 1;
1226
1227 return argc;
1228}
1229
1230static int dry_run_commit(int argc, const char **argv, const char *prefix,
1231 const struct commit *current_head, struct wt_status *s)
1232{
1233 int commitable;
1234 const char *index_file;
1235
1236 index_file = prepare_index(argc, argv, prefix, current_head, 1);
1237 commitable = run_status(stdout, index_file, prefix, 0, s);
1238 rollback_index_files();
1239
1240 return commitable ? 0 : 1;
1241}
1242
1243static int parse_status_slot(const char *slot)
1244{
1245 if (!strcasecmp(slot, "header"))
1246 return WT_STATUS_HEADER;
1247 if (!strcasecmp(slot, "branch"))
1248 return WT_STATUS_ONBRANCH;
1249 if (!strcasecmp(slot, "updated") || !strcasecmp(slot, "added"))
1250 return WT_STATUS_UPDATED;
1251 if (!strcasecmp(slot, "changed"))
1252 return WT_STATUS_CHANGED;
1253 if (!strcasecmp(slot, "untracked"))
1254 return WT_STATUS_UNTRACKED;
1255 if (!strcasecmp(slot, "nobranch"))
1256 return WT_STATUS_NOBRANCH;
1257 if (!strcasecmp(slot, "unmerged"))
1258 return WT_STATUS_UNMERGED;
1259 return -1;
1260}
1261
1262static int git_status_config(const char *k, const char *v, void *cb)
1263{
1264 struct wt_status *s = cb;
1265 const char *slot_name;
1266
1267 if (starts_with(k, "column."))
1268 return git_column_config(k, v, "status", &s->colopts);
1269 if (!strcmp(k, "status.submodulesummary")) {
1270 int is_bool;
1271 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1272 if (is_bool && s->submodule_summary)
1273 s->submodule_summary = -1;
1274 return 0;
1275 }
1276 if (!strcmp(k, "status.short")) {
1277 if (git_config_bool(k, v))
1278 status_deferred_config.status_format = STATUS_FORMAT_SHORT;
1279 else
1280 status_deferred_config.status_format = STATUS_FORMAT_NONE;
1281 return 0;
1282 }
1283 if (!strcmp(k, "status.branch")) {
1284 status_deferred_config.show_branch = git_config_bool(k, v);
1285 return 0;
1286 }
1287 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1288 s->use_color = git_config_colorbool(k, v);
1289 return 0;
1290 }
1291 if (!strcmp(k, "status.displaycommentprefix")) {
1292 s->display_comment_prefix = git_config_bool(k, v);
1293 return 0;
1294 }
1295 if (skip_prefix(k, "status.color.", &slot_name) ||
1296 skip_prefix(k, "color.status.", &slot_name)) {
1297 int slot = parse_status_slot(slot_name);
1298 if (slot < 0)
1299 return 0;
1300 if (!v)
1301 return config_error_nonbool(k);
1302 return color_parse(v, s->color_palette[slot]);
1303 }
1304 if (!strcmp(k, "status.relativepaths")) {
1305 s->relative_paths = git_config_bool(k, v);
1306 return 0;
1307 }
1308 if (!strcmp(k, "status.showuntrackedfiles")) {
1309 if (!v)
1310 return config_error_nonbool(k);
1311 else if (!strcmp(v, "no"))
1312 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1313 else if (!strcmp(v, "normal"))
1314 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1315 else if (!strcmp(v, "all"))
1316 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1317 else
1318 return error(_("Invalid untracked files mode '%s'"), v);
1319 return 0;
1320 }
1321 return git_diff_ui_config(k, v, NULL);
1322}
1323
1324int cmd_status(int argc, const char **argv, const char *prefix)
1325{
1326 static struct wt_status s;
1327 int fd;
1328 struct object_id oid;
1329 static struct option builtin_status_options[] = {
1330 OPT__VERBOSE(&verbose, N_("be verbose")),
1331 OPT_SET_INT('s', "short", &status_format,
1332 N_("show status concisely"), STATUS_FORMAT_SHORT),
1333 OPT_BOOL('b', "branch", &s.show_branch,
1334 N_("show branch information")),
1335 { OPTION_CALLBACK, 0, "porcelain", &status_format,
1336 N_("version"), N_("machine-readable output"),
1337 PARSE_OPT_OPTARG, opt_parse_porcelain },
1338 OPT_SET_INT(0, "long", &status_format,
1339 N_("show status in long format (default)"),
1340 STATUS_FORMAT_LONG),
1341 OPT_BOOL('z', "null", &s.null_termination,
1342 N_("terminate entries with NUL")),
1343 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1344 N_("mode"),
1345 N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
1346 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1347 OPT_BOOL(0, "ignored", &show_ignored_in_status,
1348 N_("show ignored files")),
1349 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
1350 N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
1351 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1352 OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
1353 OPT_END(),
1354 };
1355
1356 if (argc == 2 && !strcmp(argv[1], "-h"))
1357 usage_with_options(builtin_status_usage, builtin_status_options);
1358
1359 status_init_config(&s, git_status_config);
1360 argc = parse_options(argc, argv, prefix,
1361 builtin_status_options,
1362 builtin_status_usage, 0);
1363 finalize_colopts(&s.colopts, -1);
1364 finalize_deferred_config(&s);
1365
1366 handle_untracked_files_arg(&s);
1367 if (show_ignored_in_status)
1368 s.show_ignored_files = 1;
1369 parse_pathspec(&s.pathspec, 0,
1370 PATHSPEC_PREFER_FULL,
1371 prefix, argv);
1372
1373 read_cache_preload(&s.pathspec);
1374 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
1375
1376 fd = hold_locked_index(&index_lock, 0);
1377
1378 s.is_initial = get_sha1(s.reference, oid.hash) ? 1 : 0;
1379 if (!s.is_initial)
1380 hashcpy(s.sha1_commit, oid.hash);
1381
1382 s.ignore_submodule_arg = ignore_submodule_arg;
1383 s.status_format = status_format;
1384 s.verbose = verbose;
1385
1386 wt_status_collect(&s);
1387
1388 if (0 <= fd)
1389 update_index_if_able(&the_index, &index_lock);
1390
1391 if (s.relative_paths)
1392 s.prefix = prefix;
1393
1394 wt_status_print(&s);
1395 return 0;
1396}
1397
1398static const char *implicit_ident_advice(void)
1399{
1400 char *user_config = expand_user_path("~/.gitconfig", 0);
1401 char *xdg_config = xdg_config_home("config");
1402 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1403
1404 free(user_config);
1405 free(xdg_config);
1406
1407 if (config_exists)
1408 return _(implicit_ident_advice_config);
1409 else
1410 return _(implicit_ident_advice_noconfig);
1411
1412}
1413
1414static void print_summary(const char *prefix, const struct object_id *oid,
1415 int initial_commit)
1416{
1417 struct rev_info rev;
1418 struct commit *commit;
1419 struct strbuf format = STRBUF_INIT;
1420 struct object_id junk_oid;
1421 const char *head;
1422 struct pretty_print_context pctx = {0};
1423 struct strbuf author_ident = STRBUF_INIT;
1424 struct strbuf committer_ident = STRBUF_INIT;
1425
1426 commit = lookup_commit(oid->hash);
1427 if (!commit)
1428 die(_("couldn't look up newly created commit"));
1429 if (parse_commit(commit))
1430 die(_("could not parse newly created commit"));
1431
1432 strbuf_addstr(&format, "format:%h] %s");
1433
1434 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1435 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1436 if (strbuf_cmp(&author_ident, &committer_ident)) {
1437 strbuf_addstr(&format, "\n Author: ");
1438 strbuf_addbuf_percentquote(&format, &author_ident);
1439 }
1440 if (author_date_is_interesting()) {
1441 struct strbuf date = STRBUF_INIT;
1442 format_commit_message(commit, "%ad", &date, &pctx);
1443 strbuf_addstr(&format, "\n Date: ");
1444 strbuf_addbuf_percentquote(&format, &date);
1445 strbuf_release(&date);
1446 }
1447 if (!committer_ident_sufficiently_given()) {
1448 strbuf_addstr(&format, "\n Committer: ");
1449 strbuf_addbuf_percentquote(&format, &committer_ident);
1450 if (advice_implicit_identity) {
1451 strbuf_addch(&format, '\n');
1452 strbuf_addstr(&format, implicit_ident_advice());
1453 }
1454 }
1455 strbuf_release(&author_ident);
1456 strbuf_release(&committer_ident);
1457
1458 init_revisions(&rev, prefix);
1459 setup_revisions(0, NULL, &rev, NULL);
1460
1461 rev.diff = 1;
1462 rev.diffopt.output_format =
1463 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1464
1465 rev.verbose_header = 1;
1466 rev.show_root_diff = 1;
1467 get_commit_format(format.buf, &rev);
1468 rev.always_show_header = 0;
1469 rev.diffopt.detect_rename = 1;
1470 rev.diffopt.break_opt = 0;
1471 diff_setup_done(&rev.diffopt);
1472
1473 head = resolve_ref_unsafe("HEAD", 0, junk_oid.hash, NULL);
1474 if (!strcmp(head, "HEAD"))
1475 head = _("detached HEAD");
1476 else
1477 skip_prefix(head, "refs/heads/", &head);
1478 printf("[%s%s ", head, initial_commit ? _(" (root-commit)") : "");
1479
1480 if (!log_tree_commit(&rev, commit)) {
1481 rev.always_show_header = 1;
1482 rev.use_terminator = 1;
1483 log_tree_commit(&rev, commit);
1484 }
1485
1486 strbuf_release(&format);
1487}
1488
1489static int git_commit_config(const char *k, const char *v, void *cb)
1490{
1491 struct wt_status *s = cb;
1492 int status;
1493
1494 if (!strcmp(k, "commit.template"))
1495 return git_config_pathname(&template_file, k, v);
1496 if (!strcmp(k, "commit.status")) {
1497 include_status = git_config_bool(k, v);
1498 return 0;
1499 }
1500 if (!strcmp(k, "commit.cleanup"))
1501 return git_config_string(&cleanup_arg, k, v);
1502 if (!strcmp(k, "commit.gpgsign")) {
1503 sign_commit = git_config_bool(k, v) ? "" : NULL;
1504 return 0;
1505 }
1506 if (!strcmp(k, "commit.verbose")) {
1507 int is_bool;
1508 config_commit_verbose = git_config_bool_or_int(k, v, &is_bool);
1509 return 0;
1510 }
1511
1512 status = git_gpg_config(k, v, NULL);
1513 if (status)
1514 return status;
1515 return git_status_config(k, v, s);
1516}
1517
1518static int run_rewrite_hook(const struct object_id *oldoid,
1519 const struct object_id *newoid)
1520{
1521 struct child_process proc = CHILD_PROCESS_INIT;
1522 const char *argv[3];
1523 int code;
1524 struct strbuf sb = STRBUF_INIT;
1525
1526 argv[0] = find_hook("post-rewrite");
1527 if (!argv[0])
1528 return 0;
1529
1530 argv[1] = "amend";
1531 argv[2] = NULL;
1532
1533 proc.argv = argv;
1534 proc.in = -1;
1535 proc.stdout_to_stderr = 1;
1536
1537 code = start_command(&proc);
1538 if (code)
1539 return code;
1540 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1541 sigchain_push(SIGPIPE, SIG_IGN);
1542 write_in_full(proc.in, sb.buf, sb.len);
1543 close(proc.in);
1544 strbuf_release(&sb);
1545 sigchain_pop(SIGPIPE);
1546 return finish_command(&proc);
1547}
1548
1549int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
1550{
1551 struct argv_array hook_env = ARGV_ARRAY_INIT;
1552 va_list args;
1553 int ret;
1554
1555 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", index_file);
1556
1557 /*
1558 * Let the hook know that no editor will be launched.
1559 */
1560 if (!editor_is_used)
1561 argv_array_push(&hook_env, "GIT_EDITOR=:");
1562
1563 va_start(args, name);
1564 ret = run_hook_ve(hook_env.argv,name, args);
1565 va_end(args);
1566 argv_array_clear(&hook_env);
1567
1568 return ret;
1569}
1570
1571int cmd_commit(int argc, const char **argv, const char *prefix)
1572{
1573 static struct wt_status s;
1574 static struct option builtin_commit_options[] = {
1575 OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
1576 OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
1577
1578 OPT_GROUP(N_("Commit message options")),
1579 OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
1580 OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
1581 OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
1582 OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
1583 OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
1584 OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
1585 OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
1586 OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
1587 OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
1588 OPT_BOOL('s', "signoff", &signoff, N_("add Signed-off-by:")),
1589 OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
1590 OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
1591 OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
1592 OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
1593 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
1594 N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
1595 /* end commit message options */
1596
1597 OPT_GROUP(N_("Commit contents options")),
1598 OPT_BOOL('a', "all", &all, N_("commit all changed files")),
1599 OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")),
1600 OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
1601 OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
1602 OPT_BOOL('o', "only", &only, N_("commit only specified files")),
1603 OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit and commit-msg hooks")),
1604 OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),
1605 OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
1606 STATUS_FORMAT_SHORT),
1607 OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
1608 OPT_SET_INT(0, "porcelain", &status_format,
1609 N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
1610 OPT_SET_INT(0, "long", &status_format,
1611 N_("show status in long format (default)"),
1612 STATUS_FORMAT_LONG),
1613 OPT_BOOL('z', "null", &s.null_termination,
1614 N_("terminate entries with NUL")),
1615 OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
1616 OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
1617 { 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" },
1618 /* end commit contents options */
1619
1620 OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
1621 N_("ok to record an empty change")),
1622 OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message,
1623 N_("ok to record a change with an empty message")),
1624
1625 OPT_END()
1626 };
1627
1628 struct strbuf sb = STRBUF_INIT;
1629 struct strbuf author_ident = STRBUF_INIT;
1630 const char *index_file, *reflog_msg;
1631 char *nl;
1632 struct object_id oid;
1633 struct commit_list *parents = NULL;
1634 struct stat statbuf;
1635 struct commit *current_head = NULL;
1636 struct commit_extra_header *extra = NULL;
1637 struct ref_transaction *transaction;
1638 struct strbuf err = STRBUF_INIT;
1639
1640 if (argc == 2 && !strcmp(argv[1], "-h"))
1641 usage_with_options(builtin_commit_usage, builtin_commit_options);
1642
1643 status_init_config(&s, git_commit_config);
1644 status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
1645 s.colopts = 0;
1646
1647 if (get_sha1("HEAD", oid.hash))
1648 current_head = NULL;
1649 else {
1650 current_head = lookup_commit_or_die(oid.hash, "HEAD");
1651 if (parse_commit(current_head))
1652 die(_("could not parse HEAD commit"));
1653 }
1654 verbose = -1; /* unspecified */
1655 argc = parse_and_validate_options(argc, argv, builtin_commit_options,
1656 builtin_commit_usage,
1657 prefix, current_head, &s);
1658 if (verbose == -1)
1659 verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose;
1660
1661 if (dry_run)
1662 return dry_run_commit(argc, argv, prefix, current_head, &s);
1663 index_file = prepare_index(argc, argv, prefix, current_head, 0);
1664
1665 /* Set up everything for writing the commit object. This includes
1666 running hooks, writing the trees, and interacting with the user. */
1667 if (!prepare_to_commit(index_file, prefix,
1668 current_head, &s, &author_ident)) {
1669 rollback_index_files();
1670 return 1;
1671 }
1672
1673 /* Determine parents */
1674 reflog_msg = getenv("GIT_REFLOG_ACTION");
1675 if (!current_head) {
1676 if (!reflog_msg)
1677 reflog_msg = "commit (initial)";
1678 } else if (amend) {
1679 if (!reflog_msg)
1680 reflog_msg = "commit (amend)";
1681 parents = copy_commit_list(current_head->parents);
1682 } else if (whence == FROM_MERGE) {
1683 struct strbuf m = STRBUF_INIT;
1684 FILE *fp;
1685 int allow_fast_forward = 1;
1686 struct commit_list **pptr = &parents;
1687
1688 if (!reflog_msg)
1689 reflog_msg = "commit (merge)";
1690 pptr = commit_list_append(current_head, pptr);
1691 fp = fopen(git_path_merge_head(), "r");
1692 if (fp == NULL)
1693 die_errno(_("could not open '%s' for reading"),
1694 git_path_merge_head());
1695 while (strbuf_getline_lf(&m, fp) != EOF) {
1696 struct commit *parent;
1697
1698 parent = get_merge_parent(m.buf);
1699 if (!parent)
1700 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1701 pptr = commit_list_append(parent, pptr);
1702 }
1703 fclose(fp);
1704 strbuf_release(&m);
1705 if (!stat(git_path_merge_mode(), &statbuf)) {
1706 if (strbuf_read_file(&sb, git_path_merge_mode(), 0) < 0)
1707 die_errno(_("could not read MERGE_MODE"));
1708 if (!strcmp(sb.buf, "no-ff"))
1709 allow_fast_forward = 0;
1710 }
1711 if (allow_fast_forward)
1712 parents = reduce_heads(parents);
1713 } else {
1714 if (!reflog_msg)
1715 reflog_msg = (whence == FROM_CHERRY_PICK)
1716 ? "commit (cherry-pick)"
1717 : "commit";
1718 commit_list_insert(current_head, &parents);
1719 }
1720
1721 /* Finally, get the commit message */
1722 strbuf_reset(&sb);
1723 if (strbuf_read_file(&sb, git_path_commit_editmsg(), 0) < 0) {
1724 int saved_errno = errno;
1725 rollback_index_files();
1726 die(_("could not read commit message: %s"), strerror(saved_errno));
1727 }
1728
1729 if (verbose || /* Truncate the message just before the diff, if any. */
1730 cleanup_mode == CLEANUP_SCISSORS)
1731 wt_status_truncate_message_at_cut_line(&sb);
1732
1733 if (cleanup_mode != CLEANUP_NONE)
1734 strbuf_stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1735 if (template_untouched(&sb) && !allow_empty_message) {
1736 rollback_index_files();
1737 fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
1738 exit(1);
1739 }
1740 if (message_is_empty(&sb) && !allow_empty_message) {
1741 rollback_index_files();
1742 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
1743 exit(1);
1744 }
1745
1746 if (amend) {
1747 const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1748 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1749 } else {
1750 struct commit_extra_header **tail = &extra;
1751 append_merge_tag_headers(parents, &tail);
1752 }
1753
1754 if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->sha1,
1755 parents, oid.hash, author_ident.buf, sign_commit, extra)) {
1756 rollback_index_files();
1757 die(_("failed to write commit object"));
1758 }
1759 strbuf_release(&author_ident);
1760 free_commit_extra_headers(extra);
1761
1762 nl = strchr(sb.buf, '\n');
1763 if (nl)
1764 strbuf_setlen(&sb, nl + 1 - sb.buf);
1765 else
1766 strbuf_addch(&sb, '\n');
1767 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1768 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1769
1770 transaction = ref_transaction_begin(&err);
1771 if (!transaction ||
1772 ref_transaction_update(transaction, "HEAD", oid.hash,
1773 current_head
1774 ? current_head->object.oid.hash : null_sha1,
1775 0, sb.buf, &err) ||
1776 ref_transaction_commit(transaction, &err)) {
1777 rollback_index_files();
1778 die("%s", err.buf);
1779 }
1780 ref_transaction_free(transaction);
1781
1782 unlink(git_path_cherry_pick_head());
1783 unlink(git_path_revert_head());
1784 unlink(git_path_merge_head());
1785 unlink(git_path_merge_msg());
1786 unlink(git_path_merge_mode());
1787 unlink(git_path_squash_msg());
1788
1789 if (commit_index_files())
1790 die (_("Repository has been updated, but unable to write\n"
1791 "new_index file. Check that disk is not full and quota is\n"
1792 "not exceeded, and then \"git reset HEAD\" to recover."));
1793
1794 rerere(0);
1795 run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
1796 if (amend && !no_post_rewrite) {
1797 struct notes_rewrite_cfg *cfg;
1798 cfg = init_copy_notes_for_rewrite("amend");
1799 if (cfg) {
1800 /* we are amending, so current_head is not NULL */
1801 copy_note_for_rewrite(cfg, current_head->object.oid.hash, oid.hash);
1802 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1803 }
1804 run_rewrite_hook(¤t_head->object.oid, &oid);
1805 }
1806 if (!quiet)
1807 print_summary(prefix, &oid, !current_head);
1808
1809 strbuf_release(&err);
1810 return 0;
1811}