4 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
5 * Based on git-commit.sh by Junio C Hamano and Linus Torvalds
9 #include "cache-tree.h"
17 #include "wt-status.h"
18 #include "run-command.h"
23 #include "parse-options.h"
24 #include "string-list.h"
26 #include "unpack-trees.h"
29 static const char * const builtin_commit_usage[] = {
30 "git commit [options] [--] <filepattern>...",
34 static const char * const builtin_status_usage[] = {
35 "git status [options] [--] <filepattern>...",
39 static const char implicit_ident_advice[] =
40 "Your name and email address were configured automatically based\n"
41 "on your username and hostname. Please check that they are accurate.\n"
42 "You can suppress this message by setting them explicitly:\n"
44 " git config --global user.name \"Your Name\"\n"
45 " git config --global user.email you@example.com\n"
47 "If the identity used for this commit is wrong, you can fix it with:\n"
49 " git commit --amend --author='Your Name <you@example.com>'\n";
51 static unsigned char head_sha1[20];
53 static char *use_message_buffer;
54 static const char commit_editmsg[] = "COMMIT_EDITMSG";
55 static struct lock_file index_lock; /* real index */
56 static struct lock_file false_lock; /* used only for partial commits */
63 static const char *logfile, *force_author;
64 static const char *template_file;
65 static char *edit_message, *use_message;
66 static char *author_name, *author_email, *author_date;
67 static int all, edit_flag, also, interactive, only, amend, signoff;
68 static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
69 static int no_post_rewrite, allow_empty_message;
70 static char *untracked_files_arg, *force_date;
72 * The default commit message cleanup mode will remove the lines
73 * beginning with # (shell comments) and leading and trailing
74 * whitespaces (empty lines or containing only whitespaces)
75 * if editor is used, and only the whitespaces if the message
76 * is specified explicitly.
83 static char *cleanup_arg;
85 static int use_editor = 1, initial_commit, in_merge, include_status = 1;
86 static int show_ignored_in_status;
87 static const char *only_include_assumed;
88 static struct strbuf message;
90 static int null_termination;
94 STATUS_FORMAT_PORCELAIN,
95 } status_format = STATUS_FORMAT_LONG;
96 static int status_show_branch;
98 static int opt_parse_m(const struct option *opt, const char *arg, int unset)
100 struct strbuf *buf = opt->value;
102 strbuf_setlen(buf, 0);
104 strbuf_addstr(buf, arg);
105 strbuf_addstr(buf, "\n\n");
110 static struct option builtin_commit_options[] = {
112 OPT__VERBOSE(&verbose),
114 OPT_GROUP("Commit message options"),
115 OPT_FILENAME('F', "file", &logfile, "read log from file"),
116 OPT_STRING(0, "author", &force_author, "AUTHOR", "override author for commit"),
117 OPT_STRING(0, "date", &force_date, "DATE", "override date for commit"),
118 OPT_CALLBACK('m', "message", &message, "MESSAGE", "specify commit message", opt_parse_m),
119 OPT_STRING('c', "reedit-message", &edit_message, "COMMIT", "reuse and edit message from specified commit"),
120 OPT_STRING('C', "reuse-message", &use_message, "COMMIT", "reuse message from specified commit"),
121 OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C-c/--amend)"),
122 OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
123 OPT_FILENAME('t', "template", &template_file, "use specified template file"),
124 OPT_BOOLEAN('e', "edit", &edit_flag, "force edit of commit"),
125 OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
126 OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
127 /* end commit message options */
129 OPT_GROUP("Commit contents options"),
130 OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
131 OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
132 OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
133 OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
134 OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
135 OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
136 OPT_SET_INT(0, "short", &status_format, "show status concisely",
137 STATUS_FORMAT_SHORT),
138 OPT_BOOLEAN(0, "branch", &status_show_branch, "show branch information"),
139 OPT_SET_INT(0, "porcelain", &status_format,
140 "show porcelain output format", STATUS_FORMAT_PORCELAIN),
141 OPT_BOOLEAN('z', "null", &null_termination,
142 "terminate entries with NUL"),
143 OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
144 OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
145 { 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" },
146 /* end commit contents options */
148 { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
149 "ok to record an empty change",
150 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
151 { OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
152 "ok to record a change with an empty message",
153 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
158 static void rollback_index_files(void)
160 switch (commit_style) {
162 break; /* nothing to do */
164 rollback_lock_file(&index_lock);
167 rollback_lock_file(&index_lock);
168 rollback_lock_file(&false_lock);
173 static int commit_index_files(void)
177 switch (commit_style) {
179 break; /* nothing to do */
181 err = commit_lock_file(&index_lock);
184 err = commit_lock_file(&index_lock);
185 rollback_lock_file(&false_lock);
193 * Take a union of paths in the index and the named tree (typically, "HEAD"),
194 * and return the paths that match the given pattern in list.
196 static int list_paths(struct string_list *list, const char *with_tree,
197 const char *prefix, const char **pattern)
202 for (i = 0; pattern[i]; i++)
207 overlay_tree_on_cache(with_tree, prefix);
209 for (i = 0; i < active_nr; i++) {
210 struct cache_entry *ce = active_cache[i];
211 struct string_list_item *item;
213 if (ce->ce_flags & CE_UPDATE)
215 if (!match_pathspec(pattern, ce->name, ce_namelen(ce), 0, m))
217 item = string_list_insert(ce->name, list);
218 if (ce_skip_worktree(ce))
219 item->util = item; /* better a valid pointer than a fake one */
222 return report_path_error(m, pattern, prefix ? strlen(prefix) : 0);
225 static void add_remove_files(struct string_list *list)
228 for (i = 0; i < list->nr; i++) {
230 struct string_list_item *p = &(list->items[i]);
232 /* p->util is skip-worktree */
236 if (!lstat(p->string, &st)) {
237 if (add_to_cache(p->string, &st, 0))
238 die("updating files failed");
240 remove_file_from_cache(p->string);
244 static void create_base_index(void)
247 struct unpack_trees_options opts;
250 if (initial_commit) {
255 memset(&opts, 0, sizeof(opts));
259 opts.src_index = &the_index;
260 opts.dst_index = &the_index;
262 opts.fn = oneway_merge;
263 tree = parse_tree_indirect(head_sha1);
265 die("failed to unpack HEAD tree object");
267 init_tree_desc(&t, tree->buffer, tree->size);
268 if (unpack_trees(1, &t, &opts))
269 exit(128); /* We've already reported the error, finish dying */
272 static void refresh_cache_or_die(int refresh_flags)
275 * refresh_flags contains REFRESH_QUIET, so the only errors
276 * are for unmerged entries.
278 if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
279 die_resolve_conflict("commit");
282 static char *prepare_index(int argc, const char **argv, const char *prefix, int is_status)
285 struct string_list partial;
286 const char **pathspec = NULL;
287 int refresh_flags = REFRESH_QUIET;
290 refresh_flags |= REFRESH_UNMERGED;
292 if (interactive_add(argc, argv, prefix) != 0)
293 die("interactive add failed");
294 if (read_cache_preload(NULL) < 0)
295 die("index file corrupt");
296 commit_style = COMMIT_AS_IS;
297 return get_index_file();
301 pathspec = get_pathspec(prefix, argv);
303 if (read_cache_preload(pathspec) < 0)
304 die("index file corrupt");
307 * Non partial, non as-is commit.
309 * (1) get the real index;
310 * (2) update the_index as necessary;
311 * (3) write the_index out to the real index (still locked);
312 * (4) return the name of the locked index file.
314 * The caller should run hooks on the locked real index, and
315 * (A) if all goes well, commit the real index;
316 * (B) on failure, rollback the real index.
318 if (all || (also && pathspec && *pathspec)) {
319 fd = hold_locked_index(&index_lock, 1);
320 add_files_to_cache(also ? prefix : NULL, pathspec, 0);
321 refresh_cache_or_die(refresh_flags);
322 if (write_cache(fd, active_cache, active_nr) ||
323 close_lock_file(&index_lock))
324 die("unable to write new_index file");
325 commit_style = COMMIT_NORMAL;
326 return index_lock.filename;
332 * (1) return the name of the real index file.
334 * The caller should run hooks on the real index,
335 * and create commit from the_index.
336 * We still need to refresh the index here.
338 if (!pathspec || !*pathspec) {
339 fd = hold_locked_index(&index_lock, 1);
340 refresh_cache_or_die(refresh_flags);
341 if (write_cache(fd, active_cache, active_nr) ||
342 commit_locked_index(&index_lock))
343 die("unable to write new_index file");
344 commit_style = COMMIT_AS_IS;
345 return get_index_file();
351 * (0) find the set of affected paths;
352 * (1) get lock on the real index file;
353 * (2) update the_index with the given paths;
354 * (3) write the_index out to the real index (still locked);
355 * (4) get lock on the false index file;
356 * (5) reset the_index from HEAD;
357 * (6) update the_index the same way as (2);
358 * (7) write the_index out to the false index file;
359 * (8) return the name of the false index file (still locked);
361 * The caller should run hooks on the locked false index, and
362 * create commit from it. Then
363 * (A) if all goes well, commit the real index;
364 * (B) on failure, rollback the real index;
365 * In either case, rollback the false index.
367 commit_style = COMMIT_PARTIAL;
370 die("cannot do a partial commit during a merge.");
372 memset(&partial, 0, sizeof(partial));
373 partial.strdup_strings = 1;
374 if (list_paths(&partial, initial_commit ? NULL : "HEAD", prefix, pathspec))
378 if (read_cache() < 0)
379 die("cannot read the index");
381 fd = hold_locked_index(&index_lock, 1);
382 add_remove_files(&partial);
383 refresh_cache(REFRESH_QUIET);
384 if (write_cache(fd, active_cache, active_nr) ||
385 close_lock_file(&index_lock))
386 die("unable to write new_index file");
388 fd = hold_lock_file_for_update(&false_lock,
389 git_path("next-index-%"PRIuMAX,
390 (uintmax_t) getpid()),
394 add_remove_files(&partial);
395 refresh_cache(REFRESH_QUIET);
397 if (write_cache(fd, active_cache, active_nr) ||
398 close_lock_file(&false_lock))
399 die("unable to write temporary index file");
402 read_cache_from(false_lock.filename);
404 return false_lock.filename;
407 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
410 unsigned char sha1[20];
412 if (s->relative_paths)
417 s->reference = "HEAD^1";
419 s->verbose = verbose;
420 s->index_file = index_file;
423 s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
425 wt_status_collect(s);
427 switch (status_format) {
428 case STATUS_FORMAT_SHORT:
429 wt_shortstatus_print(s, null_termination, status_show_branch);
431 case STATUS_FORMAT_PORCELAIN:
432 wt_porcelain_print(s, null_termination);
434 case STATUS_FORMAT_LONG:
439 return s->commitable;
442 static int is_a_merge(const unsigned char *sha1)
444 struct commit *commit = lookup_commit(sha1);
445 if (!commit || parse_commit(commit))
446 die("could not parse HEAD commit");
447 return !!(commit->parents && commit->parents->next);
450 static const char sign_off_header[] = "Signed-off-by: ";
452 static void determine_author_info(void)
454 char *name, *email, *date;
456 name = getenv("GIT_AUTHOR_NAME");
457 email = getenv("GIT_AUTHOR_EMAIL");
458 date = getenv("GIT_AUTHOR_DATE");
460 if (use_message && !renew_authorship) {
461 const char *a, *lb, *rb, *eol;
463 a = strstr(use_message_buffer, "\nauthor ");
465 die("invalid commit: %s", use_message);
467 lb = strchrnul(a + strlen("\nauthor "), '<');
468 rb = strchrnul(lb, '>');
469 eol = strchrnul(rb, '\n');
470 if (!*lb || !*rb || !*eol)
471 die("invalid commit: %s", use_message);
473 if (lb == a + strlen("\nauthor "))
474 /* \nauthor <foo@example.com> */
475 name = xcalloc(1, 1);
477 name = xmemdupz(a + strlen("\nauthor "),
479 (a + strlen("\nauthor "))));
480 email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
481 date = xmemdupz(rb + strlen("> "), eol - (rb + strlen("> ")));
485 const char *lb = strstr(force_author, " <");
486 const char *rb = strchr(force_author, '>');
489 die("malformed --author parameter");
490 name = xstrndup(force_author, lb - force_author);
491 email = xstrndup(lb + 2, rb - (lb + 2));
498 author_email = email;
502 static int ends_rfc2822_footer(struct strbuf *sb)
509 const char *buf = sb->buf;
511 for (i = len - 1; i > 0; i--) {
512 if (hit && buf[i] == '\n')
514 hit = (buf[i] == '\n');
517 while (i < len - 1 && buf[i] == '\n')
520 for (; i < len; i = k) {
521 for (k = i; k < len && buf[k] != '\n'; k++)
525 if ((buf[k] == ' ' || buf[k] == '\t') && !first)
530 for (j = 0; i + j < len; j++) {
543 static int prepare_to_commit(const char *index_file, const char *prefix,
547 int commitable, saved_color_setting;
548 struct strbuf sb = STRBUF_INIT;
551 const char *hook_arg1 = NULL;
552 const char *hook_arg2 = NULL;
555 if (!no_verify && run_hook(index_file, "pre-commit", NULL))
559 strbuf_addbuf(&sb, &message);
560 hook_arg1 = "message";
561 } else if (logfile && !strcmp(logfile, "-")) {
563 fprintf(stderr, "(reading log message from standard input)\n");
564 if (strbuf_read(&sb, 0, 0) < 0)
565 die_errno("could not read log from standard input");
566 hook_arg1 = "message";
567 } else if (logfile) {
568 if (strbuf_read_file(&sb, logfile, 0) < 0)
569 die_errno("could not read log file '%s'",
571 hook_arg1 = "message";
572 } else if (use_message) {
573 buffer = strstr(use_message_buffer, "\n\n");
574 if (!buffer || buffer[2] == '\0')
575 die("commit has empty message");
576 strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
577 hook_arg1 = "commit";
578 hook_arg2 = use_message;
579 } else if (!stat(git_path("MERGE_MSG"), &statbuf)) {
580 if (strbuf_read_file(&sb, git_path("MERGE_MSG"), 0) < 0)
581 die_errno("could not read MERGE_MSG");
583 } else if (!stat(git_path("SQUASH_MSG"), &statbuf)) {
584 if (strbuf_read_file(&sb, git_path("SQUASH_MSG"), 0) < 0)
585 die_errno("could not read SQUASH_MSG");
586 hook_arg1 = "squash";
587 } else if (template_file && !stat(template_file, &statbuf)) {
588 if (strbuf_read_file(&sb, template_file, 0) < 0)
589 die_errno("could not read '%s'", template_file);
590 hook_arg1 = "template";
594 * This final case does not modify the template message,
595 * it just sets the argument to the prepare-commit-msg hook.
600 fp = fopen(git_path(commit_editmsg), "w");
602 die_errno("could not open '%s'", git_path(commit_editmsg));
604 if (cleanup_mode != CLEANUP_NONE)
608 struct strbuf sob = STRBUF_INIT;
611 strbuf_addstr(&sob, sign_off_header);
612 strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
613 getenv("GIT_COMMITTER_EMAIL")));
614 strbuf_addch(&sob, '\n');
615 for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
617 if (prefixcmp(sb.buf + i, sob.buf)) {
618 if (!i || !ends_rfc2822_footer(&sb))
619 strbuf_addch(&sb, '\n');
620 strbuf_addbuf(&sb, &sob);
622 strbuf_release(&sob);
625 if (fwrite(sb.buf, 1, sb.len, fp) < sb.len)
626 die_errno("could not write commit template");
630 determine_author_info();
632 /* This checks if committer ident is explicitly given */
633 git_committer_info(0);
634 if (use_editor && include_status) {
636 const char *committer_ident;
641 "# It looks like you may be committing a MERGE.\n"
642 "# If this is not correct, please remove the file\n"
646 git_path("MERGE_HEAD"));
650 "# Please enter the commit message for your changes.");
651 if (cleanup_mode == CLEANUP_ALL)
654 "# with '#' will be ignored, and an empty"
655 " message aborts the commit.\n");
656 else /* CLEANUP_SPACE, that is. */
659 "# with '#' will be kept; you may remove them"
660 " yourself if you want to.\n"
661 "# An empty message aborts the commit.\n");
662 if (only_include_assumed)
663 fprintf(fp, "# %s\n", only_include_assumed);
665 author_ident = xstrdup(fmt_name(author_name, author_email));
666 committer_ident = fmt_name(getenv("GIT_COMMITTER_NAME"),
667 getenv("GIT_COMMITTER_EMAIL"));
668 if (strcmp(author_ident, committer_ident))
672 ident_shown++ ? "" : "#\n",
676 if (!user_ident_sufficiently_given())
680 ident_shown++ ? "" : "#\n",
686 saved_color_setting = s->use_color;
688 commitable = run_status(fp, index_file, prefix, 1, s);
689 s->use_color = saved_color_setting;
691 unsigned char sha1[20];
692 const char *parent = "HEAD";
694 if (!active_nr && read_cache() < 0)
695 die("Cannot read index");
700 if (get_sha1(parent, sha1))
701 commitable = !!active_nr;
703 commitable = index_differs_from(parent, 0);
708 if (!commitable && !in_merge && !allow_empty &&
709 !(amend && is_a_merge(head_sha1))) {
710 run_status(stdout, index_file, prefix, 0, s);
715 * Re-read the index as pre-commit hook could have updated it,
716 * and write it out as a tree. We must do this before we invoke
717 * the editor and after we invoke run_status above.
720 read_cache_from(index_file);
721 if (!active_cache_tree)
722 active_cache_tree = cache_tree();
723 if (cache_tree_update(active_cache_tree,
724 active_cache, active_nr, 0, 0) < 0) {
725 error("Error building trees");
729 if (run_hook(index_file, "prepare-commit-msg",
730 git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
734 char index[PATH_MAX];
735 const char *env[2] = { index, NULL };
736 snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
737 if (launch_editor(git_path(commit_editmsg), NULL, env)) {
739 "Please supply the message using either -m or -F option.\n");
745 run_hook(index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
753 * Find out if the message in the strbuf contains only whitespace and
754 * Signed-off-by lines.
756 static int message_is_empty(struct strbuf *sb)
758 struct strbuf tmpl = STRBUF_INIT;
760 int eol, i, start = 0;
762 if (cleanup_mode == CLEANUP_NONE && sb->len)
765 /* See if the template is just a prefix of the message. */
766 if (template_file && strbuf_read_file(&tmpl, template_file, 0) > 0) {
767 stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
768 if (start + tmpl.len <= sb->len &&
769 memcmp(tmpl.buf, sb->buf + start, tmpl.len) == 0)
772 strbuf_release(&tmpl);
774 /* Check if the rest is just whitespace and Signed-of-by's. */
775 for (i = start; i < sb->len; i++) {
776 nl = memchr(sb->buf + i, '\n', sb->len - i);
782 if (strlen(sign_off_header) <= eol - i &&
783 !prefixcmp(sb->buf + i, sign_off_header)) {
788 if (!isspace(sb->buf[i++]))
795 static const char *find_author_by_nickname(const char *name)
797 struct rev_info revs;
798 struct commit *commit;
799 struct strbuf buf = STRBUF_INIT;
803 init_revisions(&revs, NULL);
804 strbuf_addf(&buf, "--author=%s", name);
809 setup_revisions(ac, av, &revs, NULL);
810 prepare_revision_walk(&revs);
811 commit = get_revision(&revs);
813 struct pretty_print_context ctx = {0};
814 ctx.date_mode = DATE_NORMAL;
815 strbuf_release(&buf);
816 format_commit_message(commit, "%an <%ae>", &buf, &ctx);
817 return strbuf_detach(&buf, NULL);
819 die("No existing author found with '%s'", name);
823 static void handle_untracked_files_arg(struct wt_status *s)
825 if (!untracked_files_arg)
826 ; /* default already initialized */
827 else if (!strcmp(untracked_files_arg, "no"))
828 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
829 else if (!strcmp(untracked_files_arg, "normal"))
830 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
831 else if (!strcmp(untracked_files_arg, "all"))
832 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
834 die("Invalid untracked files mode '%s'", untracked_files_arg);
837 static int parse_and_validate_options(int argc, const char *argv[],
838 const char * const usage[],
844 argc = parse_options(argc, argv, prefix, builtin_commit_options, usage,
847 if (force_author && !strchr(force_author, '>'))
848 force_author = find_author_by_nickname(force_author);
850 if (force_author && renew_authorship)
851 die("Using both --reset-author and --author does not make sense");
853 if (logfile || message.len || use_message)
858 setenv("GIT_EDITOR", ":", 1);
860 if (get_sha1("HEAD", head_sha1))
863 /* Sanity check options */
864 if (amend && initial_commit)
865 die("You have nothing to amend.");
866 if (amend && in_merge)
867 die("You are in the middle of a merge -- cannot amend.");
876 die("Only one of -c/-C/-F can be used.");
877 if (message.len && f > 0)
878 die("Option -m cannot be combined with -c/-C/-F.");
880 use_message = edit_message;
881 if (amend && !use_message)
882 use_message = "HEAD";
883 if (!use_message && renew_authorship)
884 die("--reset-author can be used only with -C, -c or --amend.");
886 unsigned char sha1[20];
887 static char utf8[] = "UTF-8";
890 struct commit *commit;
892 if (get_sha1(use_message, sha1))
893 die("could not lookup commit %s", use_message);
894 commit = lookup_commit_reference(sha1);
895 if (!commit || parse_commit(commit))
896 die("could not parse commit %s", use_message);
898 enc = strstr(commit->buffer, "\nencoding");
900 end = strchr(enc + 10, '\n');
901 enc = xstrndup(enc + 10, end - (enc + 10));
905 out_enc = git_commit_encoding ? git_commit_encoding : utf8;
907 if (strcmp(out_enc, enc))
909 reencode_string(commit->buffer, out_enc, enc);
912 * If we failed to reencode the buffer, just copy it
913 * byte for byte so the user can try to fix it up.
914 * This also handles the case where input and output
915 * encodings are identical.
917 if (use_message_buffer == NULL)
918 use_message_buffer = xstrdup(commit->buffer);
923 if (!!also + !!only + !!all + !!interactive > 1)
924 die("Only one of --include/--only/--all/--interactive can be used.");
925 if (argc == 0 && (also || (only && !amend)))
926 die("No paths with --include/--only does not make sense.");
927 if (argc == 0 && only && amend)
928 only_include_assumed = "Clever... amending the last one with dirty index.";
929 if (argc > 0 && !also && !only)
930 only_include_assumed = "Explicit paths specified without -i nor -o; assuming --only paths...";
931 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
932 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
933 else if (!strcmp(cleanup_arg, "verbatim"))
934 cleanup_mode = CLEANUP_NONE;
935 else if (!strcmp(cleanup_arg, "whitespace"))
936 cleanup_mode = CLEANUP_SPACE;
937 else if (!strcmp(cleanup_arg, "strip"))
938 cleanup_mode = CLEANUP_ALL;
940 die("Invalid cleanup mode %s", cleanup_arg);
942 handle_untracked_files_arg(s);
945 die("Paths with -a does not make sense.");
946 else if (interactive && argc > 0)
947 die("Paths with --interactive does not make sense.");
949 if (null_termination && status_format == STATUS_FORMAT_LONG)
950 status_format = STATUS_FORMAT_PORCELAIN;
951 if (status_format != STATUS_FORMAT_LONG)
957 static int dry_run_commit(int argc, const char **argv, const char *prefix,
961 const char *index_file;
963 index_file = prepare_index(argc, argv, prefix, 1);
964 commitable = run_status(stdout, index_file, prefix, 0, s);
965 rollback_index_files();
967 return commitable ? 0 : 1;
970 static int parse_status_slot(const char *var, int offset)
972 if (!strcasecmp(var+offset, "header"))
973 return WT_STATUS_HEADER;
974 if (!strcasecmp(var+offset, "updated")
975 || !strcasecmp(var+offset, "added"))
976 return WT_STATUS_UPDATED;
977 if (!strcasecmp(var+offset, "changed"))
978 return WT_STATUS_CHANGED;
979 if (!strcasecmp(var+offset, "untracked"))
980 return WT_STATUS_UNTRACKED;
981 if (!strcasecmp(var+offset, "nobranch"))
982 return WT_STATUS_NOBRANCH;
983 if (!strcasecmp(var+offset, "unmerged"))
984 return WT_STATUS_UNMERGED;
988 static int git_status_config(const char *k, const char *v, void *cb)
990 struct wt_status *s = cb;
992 if (!strcmp(k, "status.submodulesummary")) {
994 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
995 if (is_bool && s->submodule_summary)
996 s->submodule_summary = -1;
999 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1000 s->use_color = git_config_colorbool(k, v, -1);
1003 if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
1004 int slot = parse_status_slot(k, 13);
1008 return config_error_nonbool(k);
1009 color_parse(v, k, s->color_palette[slot]);
1012 if (!strcmp(k, "status.relativepaths")) {
1013 s->relative_paths = git_config_bool(k, v);
1016 if (!strcmp(k, "status.showuntrackedfiles")) {
1018 return config_error_nonbool(k);
1019 else if (!strcmp(v, "no"))
1020 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1021 else if (!strcmp(v, "normal"))
1022 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1023 else if (!strcmp(v, "all"))
1024 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1026 return error("Invalid untracked files mode '%s'", v);
1029 return git_diff_ui_config(k, v, NULL);
1032 int cmd_status(int argc, const char **argv, const char *prefix)
1036 unsigned char sha1[20];
1037 static struct option builtin_status_options[] = {
1038 OPT__VERBOSE(&verbose),
1039 OPT_SET_INT('s', "short", &status_format,
1040 "show status concisely", STATUS_FORMAT_SHORT),
1041 OPT_BOOLEAN('b', "branch", &status_show_branch,
1042 "show branch information"),
1043 OPT_SET_INT(0, "porcelain", &status_format,
1044 "show porcelain output format",
1045 STATUS_FORMAT_PORCELAIN),
1046 OPT_BOOLEAN('z', "null", &null_termination,
1047 "terminate entries with NUL"),
1048 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1050 "show untracked files, optional modes: all, normal, no. (Default: all)",
1051 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1052 OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
1053 "show ignored files"),
1057 if (null_termination && status_format == STATUS_FORMAT_LONG)
1058 status_format = STATUS_FORMAT_PORCELAIN;
1060 wt_status_prepare(&s);
1061 git_config(git_status_config, &s);
1062 in_merge = file_exists(git_path("MERGE_HEAD"));
1063 argc = parse_options(argc, argv, prefix,
1064 builtin_status_options,
1065 builtin_status_usage, 0);
1066 handle_untracked_files_arg(&s);
1067 if (show_ignored_in_status)
1068 s.show_ignored_files = 1;
1070 s.pathspec = get_pathspec(prefix, argv);
1072 read_cache_preload(s.pathspec);
1073 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);
1075 fd = hold_locked_index(&index_lock, 0);
1077 if (!write_cache(fd, active_cache, active_nr))
1078 commit_locked_index(&index_lock);
1079 rollback_lock_file(&index_lock);
1082 s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
1083 s.in_merge = in_merge;
1084 wt_status_collect(&s);
1086 if (s.relative_paths)
1088 if (s.use_color == -1)
1089 s.use_color = git_use_color_default;
1090 if (diff_use_color_default == -1)
1091 diff_use_color_default = git_use_color_default;
1093 switch (status_format) {
1094 case STATUS_FORMAT_SHORT:
1095 wt_shortstatus_print(&s, null_termination, status_show_branch);
1097 case STATUS_FORMAT_PORCELAIN:
1098 wt_porcelain_print(&s, null_termination);
1100 case STATUS_FORMAT_LONG:
1101 s.verbose = verbose;
1102 wt_status_print(&s);
1108 static void print_summary(const char *prefix, const unsigned char *sha1)
1110 struct rev_info rev;
1111 struct commit *commit;
1112 struct strbuf format = STRBUF_INIT;
1113 unsigned char junk_sha1[20];
1114 const char *head = resolve_ref("HEAD", junk_sha1, 0, NULL);
1115 struct pretty_print_context pctx = {0};
1116 struct strbuf author_ident = STRBUF_INIT;
1117 struct strbuf committer_ident = STRBUF_INIT;
1119 commit = lookup_commit(sha1);
1121 die("couldn't look up newly created commit");
1122 if (!commit || parse_commit(commit))
1123 die("could not parse newly created commit");
1125 strbuf_addstr(&format, "format:%h] %s");
1127 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1128 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1129 if (strbuf_cmp(&author_ident, &committer_ident)) {
1130 strbuf_addstr(&format, "\n Author: ");
1131 strbuf_addbuf_percentquote(&format, &author_ident);
1133 if (!user_ident_sufficiently_given()) {
1134 strbuf_addstr(&format, "\n Committer: ");
1135 strbuf_addbuf_percentquote(&format, &committer_ident);
1136 if (advice_implicit_identity) {
1137 strbuf_addch(&format, '\n');
1138 strbuf_addstr(&format, implicit_ident_advice);
1141 strbuf_release(&author_ident);
1142 strbuf_release(&committer_ident);
1144 init_revisions(&rev, prefix);
1145 setup_revisions(0, NULL, &rev, NULL);
1149 rev.diffopt.output_format =
1150 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1152 rev.verbose_header = 1;
1153 rev.show_root_diff = 1;
1154 get_commit_format(format.buf, &rev);
1155 rev.always_show_header = 0;
1156 rev.diffopt.detect_rename = 1;
1157 rev.diffopt.rename_limit = 100;
1158 rev.diffopt.break_opt = 0;
1159 diff_setup_done(&rev.diffopt);
1162 !prefixcmp(head, "refs/heads/") ?
1164 !strcmp(head, "HEAD") ?
1167 initial_commit ? " (root-commit)" : "");
1169 if (!log_tree_commit(&rev, commit)) {
1170 struct pretty_print_context ctx = {0};
1171 struct strbuf buf = STRBUF_INIT;
1172 ctx.date_mode = DATE_NORMAL;
1173 format_commit_message(commit, format.buf + 7, &buf, &ctx);
1174 printf("%s\n", buf.buf);
1175 strbuf_release(&buf);
1177 strbuf_release(&format);
1180 static int git_commit_config(const char *k, const char *v, void *cb)
1182 struct wt_status *s = cb;
1184 if (!strcmp(k, "commit.template"))
1185 return git_config_pathname(&template_file, k, v);
1186 if (!strcmp(k, "commit.status")) {
1187 include_status = git_config_bool(k, v);
1191 return git_status_config(k, v, s);
1194 static const char post_rewrite_hook[] = "hooks/post-rewrite";
1196 static int run_rewrite_hook(const unsigned char *oldsha1,
1197 const unsigned char *newsha1)
1199 /* oldsha1 SP newsha1 LF NUL */
1200 static char buf[2*40 + 3];
1201 struct child_process proc;
1202 const char *argv[3];
1206 if (access(git_path(post_rewrite_hook), X_OK) < 0)
1209 argv[0] = git_path(post_rewrite_hook);
1213 memset(&proc, 0, sizeof(proc));
1216 proc.stdout_to_stderr = 1;
1218 code = start_command(&proc);
1221 n = snprintf(buf, sizeof(buf), "%s %s\n",
1222 sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
1223 write_in_full(proc.in, buf, n);
1225 return finish_command(&proc);
1228 int cmd_commit(int argc, const char **argv, const char *prefix)
1230 struct strbuf sb = STRBUF_INIT;
1231 const char *index_file, *reflog_msg;
1233 unsigned char commit_sha1[20];
1234 struct ref_lock *ref_lock;
1235 struct commit_list *parents = NULL, **pptr = &parents;
1236 struct stat statbuf;
1237 int allow_fast_forward = 1;
1240 wt_status_prepare(&s);
1241 git_config(git_commit_config, &s);
1242 in_merge = file_exists(git_path("MERGE_HEAD"));
1243 s.in_merge = in_merge;
1245 if (s.use_color == -1)
1246 s.use_color = git_use_color_default;
1247 argc = parse_and_validate_options(argc, argv, builtin_commit_usage,
1250 if (diff_use_color_default == -1)
1251 diff_use_color_default = git_use_color_default;
1252 return dry_run_commit(argc, argv, prefix, &s);
1254 index_file = prepare_index(argc, argv, prefix, 0);
1256 /* Set up everything for writing the commit object. This includes
1257 running hooks, writing the trees, and interacting with the user. */
1258 if (!prepare_to_commit(index_file, prefix, &s)) {
1259 rollback_index_files();
1263 /* Determine parents */
1264 if (initial_commit) {
1265 reflog_msg = "commit (initial)";
1267 struct commit_list *c;
1268 struct commit *commit;
1270 reflog_msg = "commit (amend)";
1271 commit = lookup_commit(head_sha1);
1272 if (!commit || parse_commit(commit))
1273 die("could not parse HEAD commit");
1275 for (c = commit->parents; c; c = c->next)
1276 pptr = &commit_list_insert(c->item, pptr)->next;
1277 } else if (in_merge) {
1278 struct strbuf m = STRBUF_INIT;
1281 reflog_msg = "commit (merge)";
1282 pptr = &commit_list_insert(lookup_commit(head_sha1), pptr)->next;
1283 fp = fopen(git_path("MERGE_HEAD"), "r");
1285 die_errno("could not open '%s' for reading",
1286 git_path("MERGE_HEAD"));
1287 while (strbuf_getline(&m, fp, '\n') != EOF) {
1288 unsigned char sha1[20];
1289 if (get_sha1_hex(m.buf, sha1) < 0)
1290 die("Corrupt MERGE_HEAD file (%s)", m.buf);
1291 pptr = &commit_list_insert(lookup_commit(sha1), pptr)->next;
1295 if (!stat(git_path("MERGE_MODE"), &statbuf)) {
1296 if (strbuf_read_file(&sb, git_path("MERGE_MODE"), 0) < 0)
1297 die_errno("could not read MERGE_MODE");
1298 if (!strcmp(sb.buf, "no-ff"))
1299 allow_fast_forward = 0;
1301 if (allow_fast_forward)
1302 parents = reduce_heads(parents);
1304 reflog_msg = "commit";
1305 pptr = &commit_list_insert(lookup_commit(head_sha1), pptr)->next;
1308 /* Finally, get the commit message */
1310 if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
1311 int saved_errno = errno;
1312 rollback_index_files();
1313 die("could not read commit message: %s", strerror(saved_errno));
1316 /* Truncate the message just before the diff, if any. */
1318 p = strstr(sb.buf, "\ndiff --git ");
1320 strbuf_setlen(&sb, p - sb.buf + 1);
1323 if (cleanup_mode != CLEANUP_NONE)
1324 stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1325 if (message_is_empty(&sb) && !allow_empty_message) {
1326 rollback_index_files();
1327 fprintf(stderr, "Aborting commit due to empty commit message.\n");
1331 if (commit_tree(sb.buf, active_cache_tree->sha1, parents, commit_sha1,
1332 fmt_ident(author_name, author_email, author_date,
1333 IDENT_ERROR_ON_NO_NAME))) {
1334 rollback_index_files();
1335 die("failed to write commit object");
1338 ref_lock = lock_any_ref_for_update("HEAD",
1339 initial_commit ? NULL : head_sha1,
1342 nl = strchr(sb.buf, '\n');
1344 strbuf_setlen(&sb, nl + 1 - sb.buf);
1346 strbuf_addch(&sb, '\n');
1347 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1348 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1351 rollback_index_files();
1352 die("cannot lock HEAD ref");
1354 if (write_ref_sha1(ref_lock, commit_sha1, sb.buf) < 0) {
1355 rollback_index_files();
1356 die("cannot update HEAD ref");
1359 unlink(git_path("MERGE_HEAD"));
1360 unlink(git_path("MERGE_MSG"));
1361 unlink(git_path("MERGE_MODE"));
1362 unlink(git_path("SQUASH_MSG"));
1364 if (commit_index_files())
1365 die ("Repository has been updated, but unable to write\n"
1366 "new_index file. Check that disk is not full or quota is\n"
1367 "not exceeded, and then \"git reset HEAD\" to recover.");
1370 run_hook(get_index_file(), "post-commit", NULL);
1371 if (amend && !no_post_rewrite) {
1372 struct notes_rewrite_cfg *cfg;
1373 cfg = init_copy_notes_for_rewrite("amend");
1375 copy_note_for_rewrite(cfg, head_sha1, commit_sha1);
1376 finish_copy_notes_for_rewrite(cfg);
1378 run_rewrite_hook(head_sha1, commit_sha1);
1381 print_summary(prefix, commit_sha1);