config.c: trivial fix for compile-time warning
[git/dscho.git] / builtin / commit.c
bloba876a73e6b4c1f1690839ce2d447a4b77573c9f5
1 /*
2 * Builtin "git commit"
4 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
5 * Based on git-commit.sh by Junio C Hamano and Linus Torvalds
6 */
8 #include "cache.h"
9 #include "cache-tree.h"
10 #include "color.h"
11 #include "dir.h"
12 #include "builtin.h"
13 #include "diff.h"
14 #include "diffcore.h"
15 #include "commit.h"
16 #include "revision.h"
17 #include "wt-status.h"
18 #include "run-command.h"
19 #include "refs.h"
20 #include "log-tree.h"
21 #include "strbuf.h"
22 #include "utf8.h"
23 #include "parse-options.h"
24 #include "string-list.h"
25 #include "rerere.h"
26 #include "unpack-trees.h"
27 #include "quote.h"
28 #include "submodule.h"
29 #include "gpg-interface.h"
30 #include "column.h"
32 static const char * const builtin_commit_usage[] = {
33 "git commit [options] [--] <filepattern>...",
34 NULL
37 static const char * const builtin_status_usage[] = {
38 "git status [options] [--] <filepattern>...",
39 NULL
42 static const char implicit_ident_advice[] =
43 N_("Your name and email address were configured automatically based\n"
44 "on your username and hostname. Please check that they are accurate.\n"
45 "You can suppress this message by setting them explicitly:\n"
46 "\n"
47 " git config --global user.name \"Your Name\"\n"
48 " git config --global user.email you@example.com\n"
49 "\n"
50 "After doing this, you may fix the identity used for this commit with:\n"
51 "\n"
52 " git commit --amend --reset-author\n");
54 static const char empty_amend_advice[] =
55 N_("You asked to amend the most recent commit, but doing so would make\n"
56 "it empty. You can repeat your command with --allow-empty, or you can\n"
57 "remove the commit entirely with \"git reset HEAD^\".\n");
59 static const char empty_cherry_pick_advice[] =
60 N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
61 "If you wish to commit it anyway, use:\n"
62 "\n"
63 " git commit --allow-empty\n"
64 "\n"
65 "Otherwise, please use 'git reset'\n");
67 static const char *use_message_buffer;
68 static const char commit_editmsg[] = "COMMIT_EDITMSG";
69 static struct lock_file index_lock; /* real index */
70 static struct lock_file false_lock; /* used only for partial commits */
71 static enum {
72 COMMIT_AS_IS = 1,
73 COMMIT_NORMAL,
74 COMMIT_PARTIAL
75 } commit_style;
77 static const char *logfile, *force_author;
78 static const char *template_file;
80 * The _message variables are commit names from which to take
81 * the commit message and/or authorship.
83 static const char *author_message, *author_message_buffer;
84 static char *edit_message, *use_message;
85 static char *fixup_message, *squash_message;
86 static int all, also, interactive, patch_interactive, only, amend, signoff;
87 static int edit_flag = -1; /* unspecified */
88 static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
89 static int no_post_rewrite, allow_empty_message;
90 static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
91 static char *sign_commit;
92 static unsigned int colopts;
95 * The default commit message cleanup mode will remove the lines
96 * beginning with # (shell comments) and leading and trailing
97 * whitespaces (empty lines or containing only whitespaces)
98 * if editor is used, and only the whitespaces if the message
99 * is specified explicitly.
101 static enum {
102 CLEANUP_SPACE,
103 CLEANUP_NONE,
104 CLEANUP_ALL
105 } cleanup_mode;
106 static char *cleanup_arg;
108 static enum commit_whence whence;
109 static int use_editor = 1, include_status = 1;
110 static int show_ignored_in_status;
111 static const char *only_include_assumed;
112 static struct strbuf message = STRBUF_INIT;
114 static int null_termination;
115 static enum {
116 STATUS_FORMAT_LONG,
117 STATUS_FORMAT_SHORT,
118 STATUS_FORMAT_PORCELAIN
119 } status_format = STATUS_FORMAT_LONG;
120 static int status_show_branch;
122 static int opt_parse_m(const struct option *opt, const char *arg, int unset)
124 struct strbuf *buf = opt->value;
125 if (unset)
126 strbuf_setlen(buf, 0);
127 else {
128 strbuf_addstr(buf, arg);
129 strbuf_addstr(buf, "\n\n");
131 return 0;
134 static struct option builtin_commit_options[] = {
135 OPT__QUIET(&quiet, "suppress summary after successful commit"),
136 OPT__VERBOSE(&verbose, "show diff in commit message template"),
138 OPT_GROUP("Commit message options"),
139 OPT_FILENAME('F', "file", &logfile, "read message from file"),
140 OPT_STRING(0, "author", &force_author, "author", "override author for commit"),
141 OPT_STRING(0, "date", &force_date, "date", "override date for commit"),
142 OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m),
143 OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"),
144 OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"),
145 OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"),
146 OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"),
147 OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C/-c/--amend)"),
148 OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
149 OPT_FILENAME('t', "template", &template_file, "use specified template file"),
150 OPT_BOOL('e', "edit", &edit_flag, "force edit of commit"),
151 OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
152 OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
153 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id",
154 "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
155 /* end commit message options */
157 OPT_GROUP("Commit contents options"),
158 OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
159 OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
160 OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
161 OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"),
162 OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
163 OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
164 OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
165 OPT_SET_INT(0, "short", &status_format, "show status concisely",
166 STATUS_FORMAT_SHORT),
167 OPT_BOOLEAN(0, "branch", &status_show_branch, "show branch information"),
168 OPT_SET_INT(0, "porcelain", &status_format,
169 "machine-readable output", STATUS_FORMAT_PORCELAIN),
170 OPT_BOOLEAN('z', "null", &null_termination,
171 "terminate entries with NUL"),
172 OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
173 OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
174 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
175 /* end commit contents options */
177 { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
178 "ok to record an empty change",
179 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
180 { OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
181 "ok to record a change with an empty message",
182 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
184 OPT_END()
187 static void determine_whence(struct wt_status *s)
189 if (file_exists(git_path("MERGE_HEAD")))
190 whence = FROM_MERGE;
191 else if (file_exists(git_path("CHERRY_PICK_HEAD")))
192 whence = FROM_CHERRY_PICK;
193 else
194 whence = FROM_COMMIT;
195 if (s)
196 s->whence = whence;
199 static void rollback_index_files(void)
201 switch (commit_style) {
202 case COMMIT_AS_IS:
203 break; /* nothing to do */
204 case COMMIT_NORMAL:
205 rollback_lock_file(&index_lock);
206 break;
207 case COMMIT_PARTIAL:
208 rollback_lock_file(&index_lock);
209 rollback_lock_file(&false_lock);
210 break;
214 static int commit_index_files(void)
216 int err = 0;
218 switch (commit_style) {
219 case COMMIT_AS_IS:
220 break; /* nothing to do */
221 case COMMIT_NORMAL:
222 err = commit_lock_file(&index_lock);
223 break;
224 case COMMIT_PARTIAL:
225 err = commit_lock_file(&index_lock);
226 rollback_lock_file(&false_lock);
227 break;
230 return err;
234 * Take a union of paths in the index and the named tree (typically, "HEAD"),
235 * and return the paths that match the given pattern in list.
237 static int list_paths(struct string_list *list, const char *with_tree,
238 const char *prefix, const char **pattern)
240 int i;
241 char *m;
243 for (i = 0; pattern[i]; i++)
245 m = xcalloc(1, i);
247 if (with_tree) {
248 char *max_prefix = common_prefix(pattern);
249 overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
250 free(max_prefix);
253 for (i = 0; i < active_nr; i++) {
254 struct cache_entry *ce = active_cache[i];
255 struct string_list_item *item;
257 if (ce->ce_flags & CE_UPDATE)
258 continue;
259 if (!match_pathspec(pattern, ce->name, ce_namelen(ce), 0, 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 */
266 return report_path_error(m, pattern, prefix);
269 static void add_remove_files(struct string_list *list)
271 int i;
272 for (i = 0; i < list->nr; i++) {
273 struct stat st;
274 struct string_list_item *p = &(list->items[i]);
276 /* p->util is skip-worktree */
277 if (p->util)
278 continue;
280 if (!lstat(p->string, &st)) {
281 if (add_to_cache(p->string, &st, 0))
282 die(_("updating files failed"));
283 } else
284 remove_file_from_cache(p->string);
288 static void create_base_index(const struct commit *current_head)
290 struct tree *tree;
291 struct unpack_trees_options opts;
292 struct tree_desc t;
294 if (!current_head) {
295 discard_cache();
296 return;
299 memset(&opts, 0, sizeof(opts));
300 opts.head_idx = 1;
301 opts.index_only = 1;
302 opts.merge = 1;
303 opts.src_index = &the_index;
304 opts.dst_index = &the_index;
306 opts.fn = oneway_merge;
307 tree = parse_tree_indirect(current_head->object.sha1);
308 if (!tree)
309 die(_("failed to unpack HEAD tree object"));
310 parse_tree(tree);
311 init_tree_desc(&t, tree->buffer, tree->size);
312 if (unpack_trees(1, &t, &opts))
313 exit(128); /* We've already reported the error, finish dying */
316 static void refresh_cache_or_die(int refresh_flags)
319 * refresh_flags contains REFRESH_QUIET, so the only errors
320 * are for unmerged entries.
322 if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
323 die_resolve_conflict("commit");
326 static char *prepare_index(int argc, const char **argv, const char *prefix,
327 const struct commit *current_head, int is_status)
329 int fd;
330 struct string_list partial;
331 const char **pathspec = NULL;
332 char *old_index_env = NULL;
333 int refresh_flags = REFRESH_QUIET;
335 if (is_status)
336 refresh_flags |= REFRESH_UNMERGED;
338 if (*argv)
339 pathspec = get_pathspec(prefix, argv);
341 if (read_cache_preload(pathspec) < 0)
342 die(_("index file corrupt"));
344 if (interactive) {
345 fd = hold_locked_index(&index_lock, 1);
347 refresh_cache_or_die(refresh_flags);
349 if (write_cache(fd, active_cache, active_nr) ||
350 close_lock_file(&index_lock))
351 die(_("unable to create temporary index"));
353 old_index_env = getenv(INDEX_ENVIRONMENT);
354 setenv(INDEX_ENVIRONMENT, index_lock.filename, 1);
356 if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
357 die(_("interactive add failed"));
359 if (old_index_env && *old_index_env)
360 setenv(INDEX_ENVIRONMENT, old_index_env, 1);
361 else
362 unsetenv(INDEX_ENVIRONMENT);
364 discard_cache();
365 read_cache_from(index_lock.filename);
367 commit_style = COMMIT_NORMAL;
368 return index_lock.filename;
372 * Non partial, non as-is commit.
374 * (1) get the real index;
375 * (2) update the_index as necessary;
376 * (3) write the_index out to the real index (still locked);
377 * (4) return the name of the locked index file.
379 * The caller should run hooks on the locked real index, and
380 * (A) if all goes well, commit the real index;
381 * (B) on failure, rollback the real index.
383 if (all || (also && pathspec && *pathspec)) {
384 fd = hold_locked_index(&index_lock, 1);
385 add_files_to_cache(also ? prefix : NULL, pathspec, 0);
386 refresh_cache_or_die(refresh_flags);
387 update_main_cache_tree(WRITE_TREE_SILENT);
388 if (write_cache(fd, active_cache, active_nr) ||
389 close_lock_file(&index_lock))
390 die(_("unable to write new_index file"));
391 commit_style = COMMIT_NORMAL;
392 return index_lock.filename;
396 * As-is commit.
398 * (1) return the name of the real index file.
400 * The caller should run hooks on the real index,
401 * and create commit from the_index.
402 * We still need to refresh the index here.
404 if (!pathspec || !*pathspec) {
405 fd = hold_locked_index(&index_lock, 1);
406 refresh_cache_or_die(refresh_flags);
407 if (active_cache_changed) {
408 update_main_cache_tree(WRITE_TREE_SILENT);
409 if (write_cache(fd, active_cache, active_nr) ||
410 commit_locked_index(&index_lock))
411 die(_("unable to write new_index file"));
412 } else {
413 rollback_lock_file(&index_lock);
415 commit_style = COMMIT_AS_IS;
416 return get_index_file();
420 * A partial commit.
422 * (0) find the set of affected paths;
423 * (1) get lock on the real index file;
424 * (2) update the_index with the given paths;
425 * (3) write the_index out to the real index (still locked);
426 * (4) get lock on the false index file;
427 * (5) reset the_index from HEAD;
428 * (6) update the_index the same way as (2);
429 * (7) write the_index out to the false index file;
430 * (8) return the name of the false index file (still locked);
432 * The caller should run hooks on the locked false index, and
433 * create commit from it. Then
434 * (A) if all goes well, commit the real index;
435 * (B) on failure, rollback the real index;
436 * In either case, rollback the false index.
438 commit_style = COMMIT_PARTIAL;
440 if (whence != FROM_COMMIT) {
441 if (whence == FROM_MERGE)
442 die(_("cannot do a partial commit during a merge."));
443 else if (whence == FROM_CHERRY_PICK)
444 die(_("cannot do a partial commit during a cherry-pick."));
447 memset(&partial, 0, sizeof(partial));
448 partial.strdup_strings = 1;
449 if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec))
450 exit(1);
452 discard_cache();
453 if (read_cache() < 0)
454 die(_("cannot read the index"));
456 fd = hold_locked_index(&index_lock, 1);
457 add_remove_files(&partial);
458 refresh_cache(REFRESH_QUIET);
459 if (write_cache(fd, active_cache, active_nr) ||
460 close_lock_file(&index_lock))
461 die(_("unable to write new_index file"));
463 fd = hold_lock_file_for_update(&false_lock,
464 git_path("next-index-%"PRIuMAX,
465 (uintmax_t) getpid()),
466 LOCK_DIE_ON_ERROR);
468 create_base_index(current_head);
469 add_remove_files(&partial);
470 refresh_cache(REFRESH_QUIET);
472 if (write_cache(fd, active_cache, active_nr) ||
473 close_lock_file(&false_lock))
474 die(_("unable to write temporary index file"));
476 discard_cache();
477 read_cache_from(false_lock.filename);
479 return false_lock.filename;
482 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
483 struct wt_status *s)
485 unsigned char sha1[20];
487 if (s->relative_paths)
488 s->prefix = prefix;
490 if (amend) {
491 s->amend = 1;
492 s->reference = "HEAD^1";
494 s->verbose = verbose;
495 s->index_file = index_file;
496 s->fp = fp;
497 s->nowarn = nowarn;
498 s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
500 wt_status_collect(s);
502 switch (status_format) {
503 case STATUS_FORMAT_SHORT:
504 wt_shortstatus_print(s, null_termination, status_show_branch);
505 break;
506 case STATUS_FORMAT_PORCELAIN:
507 wt_porcelain_print(s, null_termination);
508 break;
509 case STATUS_FORMAT_LONG:
510 wt_status_print(s);
511 break;
514 return s->commitable;
517 static int is_a_merge(const struct commit *current_head)
519 return !!(current_head->parents && current_head->parents->next);
522 static const char sign_off_header[] = "Signed-off-by: ";
524 static void export_one(const char *var, const char *s, const char *e, int hack)
526 struct strbuf buf = STRBUF_INIT;
527 if (hack)
528 strbuf_addch(&buf, hack);
529 strbuf_addf(&buf, "%.*s", (int)(e - s), s);
530 setenv(var, buf.buf, 1);
531 strbuf_release(&buf);
534 static void determine_author_info(struct strbuf *author_ident)
536 char *name, *email, *date;
537 struct ident_split author;
539 name = getenv("GIT_AUTHOR_NAME");
540 email = getenv("GIT_AUTHOR_EMAIL");
541 date = getenv("GIT_AUTHOR_DATE");
543 if (author_message) {
544 const char *a, *lb, *rb, *eol;
545 size_t len;
547 a = strstr(author_message_buffer, "\nauthor ");
548 if (!a)
549 die(_("invalid commit: %s"), author_message);
551 lb = strchrnul(a + strlen("\nauthor "), '<');
552 rb = strchrnul(lb, '>');
553 eol = strchrnul(rb, '\n');
554 if (!*lb || !*rb || !*eol)
555 die(_("invalid commit: %s"), author_message);
557 if (lb == a + strlen("\nauthor "))
558 /* \nauthor <foo@example.com> */
559 name = xcalloc(1, 1);
560 else
561 name = xmemdupz(a + strlen("\nauthor "),
562 (lb - strlen(" ") -
563 (a + strlen("\nauthor "))));
564 email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
565 date = xmemdupz(rb + strlen("> "), eol - (rb + strlen("> ")));
566 len = eol - (rb + strlen("> "));
567 date = xmalloc(len + 2);
568 *date = '@';
569 memcpy(date + 1, rb + strlen("> "), len);
570 date[len + 1] = '\0';
573 if (force_author) {
574 const char *lb = strstr(force_author, " <");
575 const char *rb = strchr(force_author, '>');
577 if (!lb || !rb)
578 die(_("malformed --author parameter"));
579 name = xstrndup(force_author, lb - force_author);
580 email = xstrndup(lb + 2, rb - (lb + 2));
583 if (force_date)
584 date = force_date;
585 strbuf_addstr(author_ident, fmt_ident(name, email, date,
586 IDENT_ERROR_ON_NO_NAME));
587 if (!split_ident_line(&author, author_ident->buf, author_ident->len)) {
588 export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
589 export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
590 export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
594 static int ends_rfc2822_footer(struct strbuf *sb)
596 int ch;
597 int hit = 0;
598 int i, j, k;
599 int len = sb->len;
600 int first = 1;
601 const char *buf = sb->buf;
603 for (i = len - 1; i > 0; i--) {
604 if (hit && buf[i] == '\n')
605 break;
606 hit = (buf[i] == '\n');
609 while (i < len - 1 && buf[i] == '\n')
610 i++;
612 for (; i < len; i = k) {
613 for (k = i; k < len && buf[k] != '\n'; k++)
614 ; /* do nothing */
615 k++;
617 if ((buf[k] == ' ' || buf[k] == '\t') && !first)
618 continue;
620 first = 0;
622 for (j = 0; i + j < len; j++) {
623 ch = buf[i + j];
624 if (ch == ':')
625 break;
626 if (isalnum(ch) ||
627 (ch == '-'))
628 continue;
629 return 0;
632 return 1;
635 static char *cut_ident_timestamp_part(char *string)
637 char *ket = strrchr(string, '>');
638 if (!ket || ket[1] != ' ')
639 die(_("Malformed ident string: '%s'"), string);
640 *++ket = '\0';
641 return ket;
644 static int prepare_to_commit(const char *index_file, const char *prefix,
645 struct commit *current_head,
646 struct wt_status *s,
647 struct strbuf *author_ident)
649 struct stat statbuf;
650 struct strbuf committer_ident = STRBUF_INIT;
651 int commitable, saved_color_setting;
652 struct strbuf sb = STRBUF_INIT;
653 char *buffer;
654 const char *hook_arg1 = NULL;
655 const char *hook_arg2 = NULL;
656 int ident_shown = 0;
657 int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
659 /* This checks and barfs if author is badly specified */
660 determine_author_info(author_ident);
662 if (!no_verify && run_hook(index_file, "pre-commit", NULL))
663 return 0;
665 if (squash_message) {
667 * Insert the proper subject line before other commit
668 * message options add their content.
670 if (use_message && !strcmp(use_message, squash_message))
671 strbuf_addstr(&sb, "squash! ");
672 else {
673 struct pretty_print_context ctx = {0};
674 struct commit *c;
675 c = lookup_commit_reference_by_name(squash_message);
676 if (!c)
677 die(_("could not lookup commit %s"), squash_message);
678 ctx.output_encoding = get_commit_output_encoding();
679 format_commit_message(c, "squash! %s\n\n", &sb,
680 &ctx);
684 if (message.len) {
685 strbuf_addbuf(&sb, &message);
686 hook_arg1 = "message";
687 } else if (logfile && !strcmp(logfile, "-")) {
688 if (isatty(0))
689 fprintf(stderr, _("(reading log message from standard input)\n"));
690 if (strbuf_read(&sb, 0, 0) < 0)
691 die_errno(_("could not read log from standard input"));
692 hook_arg1 = "message";
693 } else if (logfile) {
694 if (strbuf_read_file(&sb, logfile, 0) < 0)
695 die_errno(_("could not read log file '%s'"),
696 logfile);
697 hook_arg1 = "message";
698 } else if (use_message) {
699 buffer = strstr(use_message_buffer, "\n\n");
700 if (!buffer || buffer[2] == '\0')
701 die(_("commit has empty message"));
702 strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
703 hook_arg1 = "commit";
704 hook_arg2 = use_message;
705 } else if (fixup_message) {
706 struct pretty_print_context ctx = {0};
707 struct commit *commit;
708 commit = lookup_commit_reference_by_name(fixup_message);
709 if (!commit)
710 die(_("could not lookup commit %s"), fixup_message);
711 ctx.output_encoding = get_commit_output_encoding();
712 format_commit_message(commit, "fixup! %s\n\n",
713 &sb, &ctx);
714 hook_arg1 = "message";
715 } else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
716 if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
717 die_errno(_("could not read MERGE_MSG"));
718 hook_arg1 = "merge";
719 } else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
720 if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
721 die_errno(_("could not read SQUASH_MSG"));
722 hook_arg1 = "squash";
723 } else if (template_file) {
724 if (strbuf_read_file(&sb, template_file, 0) < 0)
725 die_errno(_("could not read '%s'"), template_file);
726 hook_arg1 = "template";
727 clean_message_contents = 0;
731 * The remaining cases don't modify the template message, but
732 * just set the argument(s) to the prepare-commit-msg hook.
734 else if (whence == FROM_MERGE)
735 hook_arg1 = "merge";
736 else if (whence == FROM_CHERRY_PICK) {
737 hook_arg1 = "commit";
738 hook_arg2 = "CHERRY_PICK_HEAD";
741 if (squash_message) {
743 * If squash_commit was used for the commit subject,
744 * then we're possibly hijacking other commit log options.
745 * Reset the hook args to tell the real story.
747 hook_arg1 = "message";
748 hook_arg2 = "";
751 s->fp = fopen(git_path(commit_editmsg), "w");
752 if (s->fp == NULL)
753 die_errno(_("could not open '%s'"), git_path(commit_editmsg));
755 if (clean_message_contents)
756 stripspace(&sb, 0);
758 if (signoff) {
759 struct strbuf sob = STRBUF_INIT;
760 int i;
762 strbuf_addstr(&sob, sign_off_header);
763 strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
764 getenv("GIT_COMMITTER_EMAIL")));
765 strbuf_addch(&sob, '\n');
766 for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
767 ; /* do nothing */
768 if (prefixcmp(sb.buf + i, sob.buf)) {
769 if (!i || !ends_rfc2822_footer(&sb))
770 strbuf_addch(&sb, '\n');
771 strbuf_addbuf(&sb, &sob);
773 strbuf_release(&sob);
776 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
777 die_errno(_("could not write commit template"));
779 strbuf_release(&sb);
781 /* This checks if committer ident is explicitly given */
782 strbuf_addstr(&committer_ident, git_committer_info(0));
783 if (use_editor && include_status) {
784 char *ai_tmp, *ci_tmp;
785 if (whence != FROM_COMMIT)
786 status_printf_ln(s, GIT_COLOR_NORMAL,
787 whence == FROM_MERGE
788 ? _("\n"
789 "It looks like you may be committing a merge.\n"
790 "If this is not correct, please remove the file\n"
791 " %s\n"
792 "and try again.\n")
793 : _("\n"
794 "It looks like you may be committing a cherry-pick.\n"
795 "If this is not correct, please remove the file\n"
796 " %s\n"
797 "and try again.\n"),
798 git_path(whence == FROM_MERGE
799 ? "MERGE_HEAD"
800 : "CHERRY_PICK_HEAD"));
802 fprintf(s->fp, "\n");
803 if (cleanup_mode == CLEANUP_ALL)
804 status_printf(s, GIT_COLOR_NORMAL,
805 _("Please enter the commit message for your changes."
806 " Lines starting\nwith '#' will be ignored, and an empty"
807 " message aborts the commit.\n"));
808 else /* CLEANUP_SPACE, that is. */
809 status_printf(s, GIT_COLOR_NORMAL,
810 _("Please enter the commit message for your changes."
811 " Lines starting\n"
812 "with '#' will be kept; you may remove them"
813 " yourself if you want to.\n"
814 "An empty message aborts the commit.\n"));
815 if (only_include_assumed)
816 status_printf_ln(s, GIT_COLOR_NORMAL,
817 "%s", only_include_assumed);
819 ai_tmp = cut_ident_timestamp_part(author_ident->buf);
820 ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
821 if (strcmp(author_ident->buf, committer_ident.buf))
822 status_printf_ln(s, GIT_COLOR_NORMAL,
823 _("%s"
824 "Author: %s"),
825 ident_shown++ ? "" : "\n",
826 author_ident->buf);
828 if (!user_ident_sufficiently_given())
829 status_printf_ln(s, GIT_COLOR_NORMAL,
830 _("%s"
831 "Committer: %s"),
832 ident_shown++ ? "" : "\n",
833 committer_ident.buf);
835 if (ident_shown)
836 status_printf_ln(s, GIT_COLOR_NORMAL, "");
838 saved_color_setting = s->use_color;
839 s->use_color = 0;
840 commitable = run_status(s->fp, index_file, prefix, 1, s);
841 s->use_color = saved_color_setting;
843 *ai_tmp = ' ';
844 *ci_tmp = ' ';
845 } else {
846 unsigned char sha1[20];
847 const char *parent = "HEAD";
849 if (!active_nr && read_cache() < 0)
850 die(_("Cannot read index"));
852 if (amend)
853 parent = "HEAD^1";
855 if (get_sha1(parent, sha1))
856 commitable = !!active_nr;
857 else
858 commitable = index_differs_from(parent, 0);
860 strbuf_release(&committer_ident);
862 fclose(s->fp);
865 * Reject an attempt to record a non-merge empty commit without
866 * explicit --allow-empty. In the cherry-pick case, it may be
867 * empty due to conflict resolution, which the user should okay.
869 if (!commitable && whence != FROM_MERGE && !allow_empty &&
870 !(amend && is_a_merge(current_head))) {
871 run_status(stdout, index_file, prefix, 0, s);
872 if (amend)
873 fputs(_(empty_amend_advice), stderr);
874 else if (whence == FROM_CHERRY_PICK)
875 fputs(_(empty_cherry_pick_advice), stderr);
876 return 0;
880 * Re-read the index as pre-commit hook could have updated it,
881 * and write it out as a tree. We must do this before we invoke
882 * the editor and after we invoke run_status above.
884 discard_cache();
885 read_cache_from(index_file);
886 if (update_main_cache_tree(0)) {
887 error(_("Error building trees"));
888 return 0;
891 if (run_hook(index_file, "prepare-commit-msg",
892 git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
893 return 0;
895 if (use_editor) {
896 char index[PATH_MAX];
897 const char *env[2] = { NULL };
898 env[0] = index;
899 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
900 if (launch_editor(git_path(commit_editmsg), NULL, env)) {
901 fprintf(stderr,
902 _("Please supply the message using either -m or -F option.\n"));
903 exit(1);
907 if (!no_verify &&
908 run_hook(index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
909 return 0;
912 return 1;
915 static int rest_is_empty(struct strbuf *sb, int start)
917 int i, eol;
918 const char *nl;
920 /* Check if the rest is just whitespace and Signed-of-by's. */
921 for (i = start; i < sb->len; i++) {
922 nl = memchr(sb->buf + i, '\n', sb->len - i);
923 if (nl)
924 eol = nl - sb->buf;
925 else
926 eol = sb->len;
928 if (strlen(sign_off_header) <= eol - i &&
929 !prefixcmp(sb->buf + i, sign_off_header)) {
930 i = eol;
931 continue;
933 while (i < eol)
934 if (!isspace(sb->buf[i++]))
935 return 0;
938 return 1;
942 * Find out if the message in the strbuf contains only whitespace and
943 * Signed-off-by lines.
945 static int message_is_empty(struct strbuf *sb)
947 if (cleanup_mode == CLEANUP_NONE && sb->len)
948 return 0;
949 return rest_is_empty(sb, 0);
953 * See if the user edited the message in the editor or left what
954 * was in the template intact
956 static int template_untouched(struct strbuf *sb)
958 struct strbuf tmpl = STRBUF_INIT;
959 char *start;
961 if (cleanup_mode == CLEANUP_NONE && sb->len)
962 return 0;
964 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
965 return 0;
967 stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
968 start = (char *)skip_prefix(sb->buf, tmpl.buf);
969 if (!start)
970 start = sb->buf;
971 strbuf_release(&tmpl);
972 return rest_is_empty(sb, start - sb->buf);
975 static const char *find_author_by_nickname(const char *name)
977 struct rev_info revs;
978 struct commit *commit;
979 struct strbuf buf = STRBUF_INIT;
980 const char *av[20];
981 int ac = 0;
983 init_revisions(&revs, NULL);
984 strbuf_addf(&buf, "--author=%s", name);
985 av[++ac] = "--all";
986 av[++ac] = "-i";
987 av[++ac] = buf.buf;
988 av[++ac] = NULL;
989 setup_revisions(ac, av, &revs, NULL);
990 prepare_revision_walk(&revs);
991 commit = get_revision(&revs);
992 if (commit) {
993 struct pretty_print_context ctx = {0};
994 ctx.date_mode = DATE_NORMAL;
995 strbuf_release(&buf);
996 format_commit_message(commit, "%an <%ae>", &buf, &ctx);
997 return strbuf_detach(&buf, NULL);
999 die(_("No existing author found with '%s'"), name);
1003 static void handle_untracked_files_arg(struct wt_status *s)
1005 if (!untracked_files_arg)
1006 ; /* default already initialized */
1007 else if (!strcmp(untracked_files_arg, "no"))
1008 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1009 else if (!strcmp(untracked_files_arg, "normal"))
1010 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1011 else if (!strcmp(untracked_files_arg, "all"))
1012 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1013 else
1014 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
1017 static const char *read_commit_message(const char *name)
1019 const char *out_enc, *out;
1020 struct commit *commit;
1022 commit = lookup_commit_reference_by_name(name);
1023 if (!commit)
1024 die(_("could not lookup commit %s"), name);
1025 out_enc = get_commit_output_encoding();
1026 out = logmsg_reencode(commit, out_enc);
1029 * If we failed to reencode the buffer, just copy it
1030 * byte for byte so the user can try to fix it up.
1031 * This also handles the case where input and output
1032 * encodings are identical.
1034 if (out == NULL)
1035 out = xstrdup(commit->buffer);
1036 return out;
1039 static int parse_and_validate_options(int argc, const char *argv[],
1040 const char * const usage[],
1041 const char *prefix,
1042 struct commit *current_head,
1043 struct wt_status *s)
1045 int f = 0;
1047 argc = parse_options(argc, argv, prefix, builtin_commit_options, usage,
1050 if (force_author && !strchr(force_author, '>'))
1051 force_author = find_author_by_nickname(force_author);
1053 if (force_author && renew_authorship)
1054 die(_("Using both --reset-author and --author does not make sense"));
1056 if (logfile || message.len || use_message || fixup_message)
1057 use_editor = 0;
1058 if (0 <= edit_flag)
1059 use_editor = edit_flag;
1060 if (!use_editor)
1061 setenv("GIT_EDITOR", ":", 1);
1063 /* Sanity check options */
1064 if (amend && !current_head)
1065 die(_("You have nothing to amend."));
1066 if (amend && whence != FROM_COMMIT) {
1067 if (whence == FROM_MERGE)
1068 die(_("You are in the middle of a merge -- cannot amend."));
1069 else if (whence == FROM_CHERRY_PICK)
1070 die(_("You are in the middle of a cherry-pick -- cannot amend."));
1072 if (fixup_message && squash_message)
1073 die(_("Options --squash and --fixup cannot be used together"));
1074 if (use_message)
1075 f++;
1076 if (edit_message)
1077 f++;
1078 if (fixup_message)
1079 f++;
1080 if (logfile)
1081 f++;
1082 if (f > 1)
1083 die(_("Only one of -c/-C/-F/--fixup can be used."));
1084 if (message.len && f > 0)
1085 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1086 if (f || message.len)
1087 template_file = NULL;
1088 if (edit_message)
1089 use_message = edit_message;
1090 if (amend && !use_message && !fixup_message)
1091 use_message = "HEAD";
1092 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1093 die(_("--reset-author can be used only with -C, -c or --amend."));
1094 if (use_message) {
1095 use_message_buffer = read_commit_message(use_message);
1096 if (!renew_authorship) {
1097 author_message = use_message;
1098 author_message_buffer = use_message_buffer;
1101 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1102 author_message = "CHERRY_PICK_HEAD";
1103 author_message_buffer = read_commit_message(author_message);
1106 if (patch_interactive)
1107 interactive = 1;
1109 if (!!also + !!only + !!all + !!interactive > 1)
1110 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
1111 if (argc == 0 && (also || (only && !amend)))
1112 die(_("No paths with --include/--only does not make sense."));
1113 if (argc == 0 && only && amend)
1114 only_include_assumed = _("Clever... amending the last one with dirty index.");
1115 if (argc > 0 && !also && !only)
1116 only_include_assumed = _("Explicit paths specified without -i nor -o; assuming --only paths...");
1117 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1118 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1119 else if (!strcmp(cleanup_arg, "verbatim"))
1120 cleanup_mode = CLEANUP_NONE;
1121 else if (!strcmp(cleanup_arg, "whitespace"))
1122 cleanup_mode = CLEANUP_SPACE;
1123 else if (!strcmp(cleanup_arg, "strip"))
1124 cleanup_mode = CLEANUP_ALL;
1125 else
1126 die(_("Invalid cleanup mode %s"), cleanup_arg);
1128 handle_untracked_files_arg(s);
1130 if (all && argc > 0)
1131 die(_("Paths with -a does not make sense."));
1133 if (null_termination && status_format == STATUS_FORMAT_LONG)
1134 status_format = STATUS_FORMAT_PORCELAIN;
1135 if (status_format != STATUS_FORMAT_LONG)
1136 dry_run = 1;
1138 return argc;
1141 static int dry_run_commit(int argc, const char **argv, const char *prefix,
1142 const struct commit *current_head, struct wt_status *s)
1144 int commitable;
1145 const char *index_file;
1147 index_file = prepare_index(argc, argv, prefix, current_head, 1);
1148 commitable = run_status(stdout, index_file, prefix, 0, s);
1149 rollback_index_files();
1151 return commitable ? 0 : 1;
1154 static int parse_status_slot(const char *var, int offset)
1156 if (!strcasecmp(var+offset, "header"))
1157 return WT_STATUS_HEADER;
1158 if (!strcasecmp(var+offset, "branch"))
1159 return WT_STATUS_ONBRANCH;
1160 if (!strcasecmp(var+offset, "updated")
1161 || !strcasecmp(var+offset, "added"))
1162 return WT_STATUS_UPDATED;
1163 if (!strcasecmp(var+offset, "changed"))
1164 return WT_STATUS_CHANGED;
1165 if (!strcasecmp(var+offset, "untracked"))
1166 return WT_STATUS_UNTRACKED;
1167 if (!strcasecmp(var+offset, "nobranch"))
1168 return WT_STATUS_NOBRANCH;
1169 if (!strcasecmp(var+offset, "unmerged"))
1170 return WT_STATUS_UNMERGED;
1171 return -1;
1174 static int git_status_config(const char *k, const char *v, void *cb)
1176 struct wt_status *s = cb;
1178 if (!prefixcmp(k, "column."))
1179 return git_column_config(k, v, "status", &colopts);
1180 if (!strcmp(k, "status.submodulesummary")) {
1181 int is_bool;
1182 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1183 if (is_bool && s->submodule_summary)
1184 s->submodule_summary = -1;
1185 return 0;
1187 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1188 s->use_color = git_config_colorbool(k, v);
1189 return 0;
1191 if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
1192 int slot = parse_status_slot(k, 13);
1193 if (slot < 0)
1194 return 0;
1195 if (!v)
1196 return config_error_nonbool(k);
1197 color_parse(v, k, s->color_palette[slot]);
1198 return 0;
1200 if (!strcmp(k, "status.relativepaths")) {
1201 s->relative_paths = git_config_bool(k, v);
1202 return 0;
1204 if (!strcmp(k, "status.showuntrackedfiles")) {
1205 if (!v)
1206 return config_error_nonbool(k);
1207 else if (!strcmp(v, "no"))
1208 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1209 else if (!strcmp(v, "normal"))
1210 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1211 else if (!strcmp(v, "all"))
1212 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1213 else
1214 return error(_("Invalid untracked files mode '%s'"), v);
1215 return 0;
1217 return git_diff_ui_config(k, v, NULL);
1220 int cmd_status(int argc, const char **argv, const char *prefix)
1222 struct wt_status s;
1223 int fd;
1224 unsigned char sha1[20];
1225 static struct option builtin_status_options[] = {
1226 OPT__VERBOSE(&verbose, "be verbose"),
1227 OPT_SET_INT('s', "short", &status_format,
1228 "show status concisely", STATUS_FORMAT_SHORT),
1229 OPT_BOOLEAN('b', "branch", &status_show_branch,
1230 "show branch information"),
1231 OPT_SET_INT(0, "porcelain", &status_format,
1232 "machine-readable output",
1233 STATUS_FORMAT_PORCELAIN),
1234 OPT_BOOLEAN('z', "null", &null_termination,
1235 "terminate entries with NUL"),
1236 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1237 "mode",
1238 "show untracked files, optional modes: all, normal, no. (Default: all)",
1239 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1240 OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
1241 "show ignored files"),
1242 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when",
1243 "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)",
1244 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1245 OPT_COLUMN(0, "column", &colopts, "list untracked files in columns"),
1246 OPT_END(),
1249 if (argc == 2 && !strcmp(argv[1], "-h"))
1250 usage_with_options(builtin_status_usage, builtin_status_options);
1252 wt_status_prepare(&s);
1253 gitmodules_config();
1254 git_config(git_status_config, &s);
1255 determine_whence(&s);
1256 argc = parse_options(argc, argv, prefix,
1257 builtin_status_options,
1258 builtin_status_usage, 0);
1259 finalize_colopts(&colopts, -1);
1260 s.colopts = colopts;
1262 if (null_termination && status_format == STATUS_FORMAT_LONG)
1263 status_format = STATUS_FORMAT_PORCELAIN;
1265 handle_untracked_files_arg(&s);
1266 if (show_ignored_in_status)
1267 s.show_ignored_files = 1;
1268 if (*argv)
1269 s.pathspec = get_pathspec(prefix, argv);
1271 read_cache_preload(s.pathspec);
1272 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);
1274 fd = hold_locked_index(&index_lock, 0);
1275 if (0 <= fd)
1276 update_index_if_able(&the_index, &index_lock);
1278 s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1279 s.ignore_submodule_arg = ignore_submodule_arg;
1280 wt_status_collect(&s);
1282 if (s.relative_paths)
1283 s.prefix = prefix;
1285 switch (status_format) {
1286 case STATUS_FORMAT_SHORT:
1287 wt_shortstatus_print(&s, null_termination, status_show_branch);
1288 break;
1289 case STATUS_FORMAT_PORCELAIN:
1290 wt_porcelain_print(&s, null_termination);
1291 break;
1292 case STATUS_FORMAT_LONG:
1293 s.verbose = verbose;
1294 s.ignore_submodule_arg = ignore_submodule_arg;
1295 wt_status_print(&s);
1296 break;
1298 return 0;
1301 static void print_summary(const char *prefix, const unsigned char *sha1,
1302 int initial_commit)
1304 struct rev_info rev;
1305 struct commit *commit;
1306 struct strbuf format = STRBUF_INIT;
1307 unsigned char junk_sha1[20];
1308 const char *head;
1309 struct pretty_print_context pctx = {0};
1310 struct strbuf author_ident = STRBUF_INIT;
1311 struct strbuf committer_ident = STRBUF_INIT;
1313 commit = lookup_commit(sha1);
1314 if (!commit)
1315 die(_("couldn't look up newly created commit"));
1316 if (!commit || parse_commit(commit))
1317 die(_("could not parse newly created commit"));
1319 strbuf_addstr(&format, "format:%h] %s");
1321 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1322 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1323 if (strbuf_cmp(&author_ident, &committer_ident)) {
1324 strbuf_addstr(&format, "\n Author: ");
1325 strbuf_addbuf_percentquote(&format, &author_ident);
1327 if (!user_ident_sufficiently_given()) {
1328 strbuf_addstr(&format, "\n Committer: ");
1329 strbuf_addbuf_percentquote(&format, &committer_ident);
1330 if (advice_implicit_identity) {
1331 strbuf_addch(&format, '\n');
1332 strbuf_addstr(&format, _(implicit_ident_advice));
1335 strbuf_release(&author_ident);
1336 strbuf_release(&committer_ident);
1338 init_revisions(&rev, prefix);
1339 setup_revisions(0, NULL, &rev, NULL);
1341 rev.diff = 1;
1342 rev.diffopt.output_format =
1343 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1345 rev.verbose_header = 1;
1346 rev.show_root_diff = 1;
1347 get_commit_format(format.buf, &rev);
1348 rev.always_show_header = 0;
1349 rev.diffopt.detect_rename = 1;
1350 rev.diffopt.break_opt = 0;
1351 diff_setup_done(&rev.diffopt);
1353 head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1354 printf("[%s%s ",
1355 !prefixcmp(head, "refs/heads/") ?
1356 head + 11 :
1357 !strcmp(head, "HEAD") ?
1358 _("detached HEAD") :
1359 head,
1360 initial_commit ? _(" (root-commit)") : "");
1362 if (!log_tree_commit(&rev, commit)) {
1363 rev.always_show_header = 1;
1364 rev.use_terminator = 1;
1365 log_tree_commit(&rev, commit);
1368 strbuf_release(&format);
1371 static int git_commit_config(const char *k, const char *v, void *cb)
1373 struct wt_status *s = cb;
1374 int status;
1376 if (!strcmp(k, "commit.template"))
1377 return git_config_pathname(&template_file, k, v);
1378 if (!strcmp(k, "commit.status")) {
1379 include_status = git_config_bool(k, v);
1380 return 0;
1383 status = git_gpg_config(k, v, NULL);
1384 if (status)
1385 return status;
1386 return git_status_config(k, v, s);
1389 static const char post_rewrite_hook[] = "hooks/post-rewrite";
1391 static int run_rewrite_hook(const unsigned char *oldsha1,
1392 const unsigned char *newsha1)
1394 /* oldsha1 SP newsha1 LF NUL */
1395 static char buf[2*40 + 3];
1396 struct child_process proc;
1397 const char *argv[3];
1398 int code;
1399 size_t n;
1401 if (access(git_path(post_rewrite_hook), X_OK) < 0)
1402 return 0;
1404 argv[0] = git_path(post_rewrite_hook);
1405 argv[1] = "amend";
1406 argv[2] = NULL;
1408 memset(&proc, 0, sizeof(proc));
1409 proc.argv = argv;
1410 proc.in = -1;
1411 proc.stdout_to_stderr = 1;
1413 code = start_command(&proc);
1414 if (code)
1415 return code;
1416 n = snprintf(buf, sizeof(buf), "%s %s\n",
1417 sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
1418 write_in_full(proc.in, buf, n);
1419 close(proc.in);
1420 return finish_command(&proc);
1423 int cmd_commit(int argc, const char **argv, const char *prefix)
1425 struct strbuf sb = STRBUF_INIT;
1426 struct strbuf author_ident = STRBUF_INIT;
1427 const char *index_file, *reflog_msg;
1428 char *nl, *p;
1429 unsigned char sha1[20];
1430 struct ref_lock *ref_lock;
1431 struct commit_list *parents = NULL, **pptr = &parents;
1432 struct stat statbuf;
1433 int allow_fast_forward = 1;
1434 struct wt_status s;
1435 struct commit *current_head = NULL;
1436 struct commit_extra_header *extra = NULL;
1438 if (argc == 2 && !strcmp(argv[1], "-h"))
1439 usage_with_options(builtin_commit_usage, builtin_commit_options);
1441 wt_status_prepare(&s);
1442 git_config(git_commit_config, &s);
1443 determine_whence(&s);
1445 if (get_sha1("HEAD", sha1))
1446 current_head = NULL;
1447 else {
1448 current_head = lookup_commit_or_die(sha1, "HEAD");
1449 if (!current_head || parse_commit(current_head))
1450 die(_("could not parse HEAD commit"));
1452 argc = parse_and_validate_options(argc, argv, builtin_commit_usage,
1453 prefix, current_head, &s);
1454 if (dry_run)
1455 return dry_run_commit(argc, argv, prefix, current_head, &s);
1456 index_file = prepare_index(argc, argv, prefix, current_head, 0);
1458 /* Set up everything for writing the commit object. This includes
1459 running hooks, writing the trees, and interacting with the user. */
1460 if (!prepare_to_commit(index_file, prefix,
1461 current_head, &s, &author_ident)) {
1462 rollback_index_files();
1463 return 1;
1466 /* Determine parents */
1467 reflog_msg = getenv("GIT_REFLOG_ACTION");
1468 if (!current_head) {
1469 if (!reflog_msg)
1470 reflog_msg = "commit (initial)";
1471 } else if (amend) {
1472 struct commit_list *c;
1474 if (!reflog_msg)
1475 reflog_msg = "commit (amend)";
1476 for (c = current_head->parents; c; c = c->next)
1477 pptr = &commit_list_insert(c->item, pptr)->next;
1478 } else if (whence == FROM_MERGE) {
1479 struct strbuf m = STRBUF_INIT;
1480 FILE *fp;
1482 if (!reflog_msg)
1483 reflog_msg = "commit (merge)";
1484 pptr = &commit_list_insert(current_head, pptr)->next;
1485 fp = fopen(git_path("MERGE_HEAD"), "r");
1486 if (fp == NULL)
1487 die_errno(_("could not open '%s' for reading"),
1488 git_path("MERGE_HEAD"));
1489 while (strbuf_getline(&m, fp, '\n') != EOF) {
1490 struct commit *parent;
1492 parent = get_merge_parent(m.buf);
1493 if (!parent)
1494 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1495 pptr = &commit_list_insert(parent, pptr)->next;
1497 fclose(fp);
1498 strbuf_release(&m);
1499 if (!stat(git_path("MERGE_MODE"), &statbuf)) {
1500 if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1501 die_errno(_("could not read MERGE_MODE"));
1502 if (!strcmp(sb.buf, "no-ff"))
1503 allow_fast_forward = 0;
1505 if (allow_fast_forward)
1506 parents = reduce_heads(parents);
1507 } else {
1508 if (!reflog_msg)
1509 reflog_msg = (whence == FROM_CHERRY_PICK)
1510 ? "commit (cherry-pick)"
1511 : "commit";
1512 pptr = &commit_list_insert(current_head, pptr)->next;
1515 /* Finally, get the commit message */
1516 strbuf_reset(&sb);
1517 if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1518 int saved_errno = errno;
1519 rollback_index_files();
1520 die(_("could not read commit message: %s"), strerror(saved_errno));
1523 /* Truncate the message just before the diff, if any. */
1524 if (verbose) {
1525 p = strstr(sb.buf, "\ndiff --git ");
1526 if (p != NULL)
1527 strbuf_setlen(&sb, p - sb.buf + 1);
1530 if (cleanup_mode != CLEANUP_NONE)
1531 stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1532 if (template_untouched(&sb) && !allow_empty_message) {
1533 rollback_index_files();
1534 fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
1535 exit(1);
1537 if (message_is_empty(&sb) && !allow_empty_message) {
1538 rollback_index_files();
1539 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
1540 exit(1);
1543 if (amend) {
1544 const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1545 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1546 } else {
1547 struct commit_extra_header **tail = &extra;
1548 append_merge_tag_headers(parents, &tail);
1551 if (commit_tree_extended(&sb, active_cache_tree->sha1, parents, sha1,
1552 author_ident.buf, sign_commit, extra)) {
1553 rollback_index_files();
1554 die(_("failed to write commit object"));
1556 strbuf_release(&author_ident);
1557 free_commit_extra_headers(extra);
1559 ref_lock = lock_any_ref_for_update("HEAD",
1560 !current_head
1561 ? NULL
1562 : current_head->object.sha1,
1565 nl = strchr(sb.buf, '\n');
1566 if (nl)
1567 strbuf_setlen(&sb, nl + 1 - sb.buf);
1568 else
1569 strbuf_addch(&sb, '\n');
1570 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1571 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1573 if (!ref_lock) {
1574 rollback_index_files();
1575 die(_("cannot lock HEAD ref"));
1577 if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
1578 rollback_index_files();
1579 die(_("cannot update HEAD ref"));
1582 unlink(git_path("CHERRY_PICK_HEAD"));
1583 unlink(git_path("REVERT_HEAD"));
1584 unlink(git_path("MERGE_HEAD"));
1585 unlink(git_path("MERGE_MSG"));
1586 unlink(git_path("MERGE_MODE"));
1587 unlink(git_path("SQUASH_MSG"));
1589 if (commit_index_files())
1590 die (_("Repository has been updated, but unable to write\n"
1591 "new_index file. Check that disk is not full or quota is\n"
1592 "not exceeded, and then \"git reset HEAD\" to recover."));
1594 rerere(0);
1595 run_hook(get_index_file(), "post-commit", NULL);
1596 if (amend && !no_post_rewrite) {
1597 struct notes_rewrite_cfg *cfg;
1598 cfg = init_copy_notes_for_rewrite("amend");
1599 if (cfg) {
1600 /* we are amending, so current_head is not NULL */
1601 copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
1602 finish_copy_notes_for_rewrite(cfg);
1604 run_rewrite_hook(current_head->object.sha1, sha1);
1606 if (!quiet)
1607 print_summary(prefix, sha1, !current_head);
1609 return 0;