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