blob: 4e683943919c9200209a3c7247b5d2927ebfbbc7 [file] [log] [blame]
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001/*
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"
Brandon Williamsb2141fc2017-06-14 11:07:36 -07009#include "config.h"
Michael Haggerty697cc8e2014-10-01 12:28:42 +020010#include "lockfile.h"
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -050011#include "cache-tree.h"
Matthias Kestenholz6b2f2d92008-02-18 08:26:03 +010012#include "color.h"
Junio C Hamano28886052007-11-18 01:52:55 -080013#include "dir.h"
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -050014#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"
Johannes Schindelinc455c872008-07-21 19:03:49 +010026#include "string-list.h"
Stephan Beyer5b2fd952008-07-09 14:58:57 +020027#include "rerere.h"
Linus Torvaldsfa9dcf82008-01-13 00:30:56 -080028#include "unpack-trees.h"
Junio C Hamano76e2f7c2009-08-07 23:31:57 -070029#include "quote.h"
Jens Lehmann302ad7a2010-08-06 00:40:48 +020030#include "submodule.h"
Junio C Hamanoba3c69a2011-10-05 17:23:20 -070031#include "gpg-interface.h"
Nguyễn Thái Ngọc Duy323d0532012-04-13 17:54:39 +070032#include "column.h"
Miklos Vajna5ed75e22012-09-14 08:52:03 +020033#include "sequencer.h"
Johan Herland49c24702013-06-12 02:13:00 +020034#include "notes-utils.h"
Antoine Pelisseea167942013-08-23 15:48:31 +020035#include "mailmap.h"
Clemens Buchacheraf65f682015-11-16 09:05:58 +010036#include "sigchain.h"
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -050037
38static const char * const builtin_commit_usage[] = {
Alex Henrie9c9b4f22015-01-13 00:44:47 -070039 N_("git commit [<options>] [--] <pathspec>..."),
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -050040 NULL
41};
42
Shawn Bohrer2f02b252007-12-02 23:02:09 -060043static const char * const builtin_status_usage[] = {
Alex Henrie9c9b4f22015-01-13 00:44:47 -070044 N_("git status [<options>] [--] <pathspec>..."),
Shawn Bohrer2f02b252007-12-02 23:02:09 -060045 NULL
46};
47
Matthieu Moy8b27ff72014-07-25 21:11:36 +020048static const char implicit_ident_advice_noconfig[] =
49N_("Your name and email address were configured automatically based\n"
50"on your username and hostname. Please check that they are accurate.\n"
51"You can suppress this message by setting them explicitly. Run the\n"
52"following command and follow the instructions in your editor to edit\n"
53"your configuration file:\n"
54"\n"
55" git config --global --edit\n"
56"\n"
57"After doing this, you may fix the identity used for this commit with:\n"
58"\n"
59" git commit --amend --reset-author\n");
60
61static const char implicit_ident_advice_config[] =
Ævar Arnfjörð Bjarmasonfc88e312011-02-22 23:41:49 +000062N_("Your name and email address were configured automatically based\n"
Jeff King49ff9a72010-01-13 12:39:51 -050063"on your username and hostname. Please check that they are accurate.\n"
64"You can suppress this message by setting them explicitly:\n"
65"\n"
Matt Kraai8bb45b22010-02-24 06:18:25 -080066" git config --global user.name \"Your Name\"\n"
Jeff King49ff9a72010-01-13 12:39:51 -050067" git config --global user.email you@example.com\n"
68"\n"
Matthieu Moy3f142462011-01-12 19:29:14 +010069"After doing this, you may fix the identity used for this commit with:\n"
Jeff King49ff9a72010-01-13 12:39:51 -050070"\n"
Ævar Arnfjörð Bjarmasonfc88e312011-02-22 23:41:49 +000071" git commit --amend --reset-author\n");
Jeff King49ff9a72010-01-13 12:39:51 -050072
Jeff Kingf197ed22010-06-06 20:41:46 -040073static const char empty_amend_advice[] =
Ævar Arnfjörð Bjarmasonfc88e312011-02-22 23:41:49 +000074N_("You asked to amend the most recent commit, but doing so would make\n"
Jeff Kingf197ed22010-06-06 20:41:46 -040075"it empty. You can repeat your command with --allow-empty, or you can\n"
Ævar Arnfjörð Bjarmasonfc88e312011-02-22 23:41:49 +000076"remove the commit entirely with \"git reset HEAD^\".\n");
Jeff Kingf197ed22010-06-06 20:41:46 -040077
Jay Soffian37f7a852011-02-19 23:12:29 -050078static const char empty_cherry_pick_advice[] =
Junio C Hamano6c80cd22011-04-01 17:55:55 -070079N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
Jay Soffian37f7a852011-02-19 23:12:29 -050080"If you wish to commit it anyway, use:\n"
81"\n"
82" git commit --allow-empty\n"
Jeff Kingc17592a2013-07-26 19:39:28 -040083"\n");
84
85static const char empty_cherry_pick_advice_single[] =
86N_("Otherwise, please use 'git reset'\n");
87
88static const char empty_cherry_pick_advice_multi[] =
89N_("If you wish to skip this commit, use:\n"
Jay Soffian37f7a852011-02-19 23:12:29 -050090"\n"
Jeff Kingc17592a2013-07-26 19:39:28 -040091" git reset\n"
92"\n"
93"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
94"the remaining commits.\n");
Jay Soffian37f7a852011-02-19 23:12:29 -050095
Pranit Bauvae51b0df2016-05-25 00:49:50 +053096static GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
97
Jay Soffian37f7a852011-02-19 23:12:29 -050098static const char *use_message_buffer;
Junio C Hamano28886052007-11-18 01:52:55 -080099static struct lock_file index_lock; /* real index */
100static struct lock_file false_lock; /* used only for partial commits */
101static enum {
102 COMMIT_AS_IS = 1,
103 COMMIT_NORMAL,
Gary V. Vaughan4b055482010-05-14 09:31:35 +0000104 COMMIT_PARTIAL
Junio C Hamano28886052007-11-18 01:52:55 -0800105} commit_style;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500106
Junio C Hamanodbd0f5c2008-08-06 11:43:47 -0700107static const char *logfile, *force_author;
Brian Hetro984c6e72008-07-05 01:24:40 -0400108static const char *template_file;
Jay Soffian37f7a852011-02-19 23:12:29 -0500109/*
110 * The _message variables are commit names from which to take
111 * the commit message and/or authorship.
112 */
113static const char *author_message, *author_message_buffer;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500114static char *edit_message, *use_message;
Pat Notz89ac1222010-11-02 13:59:11 -0600115static char *fixup_message, *squash_message;
Junio C Hamanoca1ba202011-12-06 13:09:55 -0800116static int all, also, interactive, patch_interactive, only, amend, signoff;
117static int edit_flag = -1; /* unspecified */
Erick Mattosc51f6ce2009-11-04 01:20:11 -0200118static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
Pranit Bauvaaaab8422016-05-05 15:20:02 +0530119static int config_commit_verbose = -1; /* unspecified */
Ævar Arnfjörð Bjarmasonc9b5fde2010-04-06 08:40:35 +0000120static int no_post_rewrite, allow_empty_message;
Jameson Millereec0f7f2017-10-30 13:21:37 -0400121static char *untracked_files_arg, *force_date, *ignore_submodule_arg, *ignored_arg;
Junio C Hamanoba3c69a2011-10-05 17:23:20 -0700122static char *sign_commit;
123
Alex Riesen5f065732007-12-22 19:46:24 +0100124/*
125 * The default commit message cleanup mode will remove the lines
126 * beginning with # (shell comments) and leading and trailing
127 * whitespaces (empty lines or containing only whitespaces)
128 * if editor is used, and only the whitespaces if the message
129 * is specified explicitly.
130 */
131static enum {
132 CLEANUP_SPACE,
133 CLEANUP_NONE,
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +0700134 CLEANUP_SCISSORS,
Gary V. Vaughan4b055482010-05-14 09:31:35 +0000135 CLEANUP_ALL
Alex Riesen5f065732007-12-22 19:46:24 +0100136} cleanup_mode;
Ralf Thielow51fb3a32013-01-10 18:45:59 +0100137static const char *cleanup_arg;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500138
Jay Soffian37f7a852011-02-19 23:12:29 -0500139static enum commit_whence whence;
Jeff Kingc17592a2013-07-26 19:39:28 -0400140static int sequencer_in_use;
Junio C Hamano06bb6432011-08-19 11:58:18 -0700141static int use_editor = 1, include_status = 1;
Jameson Millereec0f7f2017-10-30 13:21:37 -0400142static int have_option_m;
Jeff King2c477892011-12-18 00:03:22 -0500143static struct strbuf message = STRBUF_INIT;
Johannes Schindelinf9568532007-11-11 17:36:39 +0000144
Jeff Hostetlerbe7e7952016-08-05 18:00:27 -0400145static enum wt_status_format status_format = STATUS_FORMAT_UNSPECIFIED;
Junio C Hamano84b42022013-06-24 11:41:40 -0700146
Jeff Hostetlerc4f596b2016-08-05 18:00:28 -0400147static int opt_parse_porcelain(const struct option *opt, const char *arg, int unset)
148{
149 enum wt_status_format *value = (enum wt_status_format *)opt->value;
150 if (unset)
151 *value = STATUS_FORMAT_NONE;
152 else if (!arg)
153 *value = STATUS_FORMAT_PORCELAIN;
154 else if (!strcmp(arg, "v1") || !strcmp(arg, "1"))
155 *value = STATUS_FORMAT_PORCELAIN;
Jeff Hostetler1ecdecc2016-08-11 10:45:57 -0400156 else if (!strcmp(arg, "v2") || !strcmp(arg, "2"))
157 *value = STATUS_FORMAT_PORCELAIN_V2;
Jeff Hostetlerc4f596b2016-08-05 18:00:28 -0400158 else
159 die("unsupported porcelain version '%s'", arg);
160
161 return 0;
162}
Jeff King7c9f7032009-09-05 04:59:56 -0400163
Johannes Schindelinf9568532007-11-11 17:36:39 +0000164static int opt_parse_m(const struct option *opt, const char *arg, int unset)
165{
166 struct strbuf *buf = opt->value;
René Scharfe25206772013-05-25 23:43:34 +0200167 if (unset) {
168 have_option_m = 0;
Johannes Schindelinf9568532007-11-11 17:36:39 +0000169 strbuf_setlen(buf, 0);
René Scharfe25206772013-05-25 23:43:34 +0200170 } else {
171 have_option_m = 1;
Brandon Caseya24a41e2013-02-18 20:17:06 -0800172 if (buf->len)
173 strbuf_addch(buf, '\n');
Johannes Schindelinf9568532007-11-11 17:36:39 +0000174 strbuf_addstr(buf, arg);
Brandon Caseya24a41e2013-02-18 20:17:06 -0800175 strbuf_complete_line(buf);
Johannes Schindelinf9568532007-11-11 17:36:39 +0000176 }
177 return 0;
178}
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500179
Jay Soffian37f7a852011-02-19 23:12:29 -0500180static void determine_whence(struct wt_status *s)
181{
Jeff Kingf9327292015-08-10 05:38:57 -0400182 if (file_exists(git_path_merge_head()))
Jay Soffian37f7a852011-02-19 23:12:29 -0500183 whence = FROM_MERGE;
Jeff Kingf9327292015-08-10 05:38:57 -0400184 else if (file_exists(git_path_cherry_pick_head())) {
Jay Soffian37f7a852011-02-19 23:12:29 -0500185 whence = FROM_CHERRY_PICK;
Johannes Schindelin8a2a0f52016-10-14 15:17:12 +0200186 if (file_exists(git_path_seq_dir()))
Jeff Kingc17592a2013-07-26 19:39:28 -0400187 sequencer_in_use = 1;
188 }
Jay Soffian37f7a852011-02-19 23:12:29 -0500189 else
190 whence = FROM_COMMIT;
191 if (s)
192 s->whence = whence;
193}
194
Matthieu Moy5c25dfa2013-09-12 12:50:04 +0200195static void status_init_config(struct wt_status *s, config_fn_t fn)
196{
197 wt_status_prepare(s);
Matthieu Moy5c25dfa2013-09-12 12:50:04 +0200198 git_config(fn, s);
199 determine_whence(s);
Matthieu Moy5404c112016-02-25 09:59:21 +0100200 init_diff_ui_defaults();
Matthieu Moy6a964f52013-09-12 12:50:05 +0200201 s->hints = advice_status_hints; /* must come after git_config() */
Matthieu Moy5c25dfa2013-09-12 12:50:04 +0200202}
203
Junio C Hamano28886052007-11-18 01:52:55 -0800204static void rollback_index_files(void)
205{
206 switch (commit_style) {
207 case COMMIT_AS_IS:
208 break; /* nothing to do */
209 case COMMIT_NORMAL:
210 rollback_lock_file(&index_lock);
211 break;
212 case COMMIT_PARTIAL:
213 rollback_lock_file(&index_lock);
214 rollback_lock_file(&false_lock);
215 break;
216 }
217}
218
Brandon Casey5a9dd392008-01-23 11:21:22 -0600219static int commit_index_files(void)
Junio C Hamano28886052007-11-18 01:52:55 -0800220{
Brandon Casey5a9dd392008-01-23 11:21:22 -0600221 int err = 0;
222
Junio C Hamano28886052007-11-18 01:52:55 -0800223 switch (commit_style) {
224 case COMMIT_AS_IS:
225 break; /* nothing to do */
226 case COMMIT_NORMAL:
Brandon Casey5a9dd392008-01-23 11:21:22 -0600227 err = commit_lock_file(&index_lock);
Junio C Hamano28886052007-11-18 01:52:55 -0800228 break;
229 case COMMIT_PARTIAL:
Brandon Casey5a9dd392008-01-23 11:21:22 -0600230 err = commit_lock_file(&index_lock);
Junio C Hamano28886052007-11-18 01:52:55 -0800231 rollback_lock_file(&false_lock);
232 break;
233 }
Brandon Casey5a9dd392008-01-23 11:21:22 -0600234
235 return err;
Junio C Hamano28886052007-11-18 01:52:55 -0800236}
237
238/*
239 * Take a union of paths in the index and the named tree (typically, "HEAD"),
240 * and return the paths that match the given pattern in list.
241 */
Johannes Schindelinc455c872008-07-21 19:03:49 +0100242static int list_paths(struct string_list *list, const char *with_tree,
Nguyễn Thái Ngọc Duy17ddc662013-07-14 15:35:53 +0700243 const char *prefix, const struct pathspec *pattern)
Junio C Hamano28886052007-11-18 01:52:55 -0800244{
Stefan Beller5d0b9bf2015-03-20 17:28:07 -0700245 int i, ret;
Junio C Hamano28886052007-11-18 01:52:55 -0800246 char *m;
247
Nguyễn Thái Ngọc Duy17ddc662013-07-14 15:35:53 +0700248 if (!pattern->nr)
Junio C Hamanob9a08012012-07-15 21:39:48 -0700249 return 0;
250
Nguyễn Thái Ngọc Duy17ddc662013-07-14 15:35:53 +0700251 m = xcalloc(1, pattern->nr);
Junio C Hamano28886052007-11-18 01:52:55 -0800252
Clemens Buchacher8894d532011-07-30 19:13:47 +0200253 if (with_tree) {
Clemens Buchacherf950eb92011-09-04 12:42:01 +0200254 char *max_prefix = common_prefix(pattern);
Brandon Williams312c9842017-06-12 15:13:58 -0700255 overlay_tree_on_index(&the_index, with_tree,
256 max_prefix ? max_prefix : prefix);
Clemens Buchacher5879f562011-09-04 12:41:59 +0200257 free(max_prefix);
Clemens Buchacher8894d532011-07-30 19:13:47 +0200258 }
Junio C Hamano28886052007-11-18 01:52:55 -0800259
260 for (i = 0; i < active_nr; i++) {
Nguyễn Thái Ngọc Duy9c5e6c82013-07-09 22:29:00 +0700261 const struct cache_entry *ce = active_cache[i];
Nguyễn Thái Ngọc Duy7fce6e32009-12-14 18:43:59 +0700262 struct string_list_item *item;
263
Linus Torvalds7a51ed62008-01-14 16:03:17 -0800264 if (ce->ce_flags & CE_UPDATE)
Junio C Hamanoe87e22d2008-01-14 13:54:24 -0800265 continue;
Nguyễn Thái Ngọc Duy429bb402014-01-24 20:40:28 +0700266 if (!ce_path_match(ce, pattern, m))
Junio C Hamano28886052007-11-18 01:52:55 -0800267 continue;
Julian Phillips78a395d2010-06-26 00:41:35 +0100268 item = string_list_insert(list, ce->name);
Nguyễn Thái Ngọc Duy7fce6e32009-12-14 18:43:59 +0700269 if (ce_skip_worktree(ce))
270 item->util = item; /* better a valid pointer than a fake one */
Junio C Hamano28886052007-11-18 01:52:55 -0800271 }
272
Stefan Beller5d0b9bf2015-03-20 17:28:07 -0700273 ret = report_path_error(m, pattern, prefix);
274 free(m);
275 return ret;
Junio C Hamano28886052007-11-18 01:52:55 -0800276}
277
Johannes Schindelinc455c872008-07-21 19:03:49 +0100278static void add_remove_files(struct string_list *list)
Junio C Hamano28886052007-11-18 01:52:55 -0800279{
280 int i;
281 for (i = 0; i < list->nr; i++) {
Linus Torvaldsd177cab2008-05-09 09:11:43 -0700282 struct stat st;
Johannes Schindelinc455c872008-07-21 19:03:49 +0100283 struct string_list_item *p = &(list->items[i]);
Linus Torvaldsd177cab2008-05-09 09:11:43 -0700284
Nguyễn Thái Ngọc Duy7fce6e32009-12-14 18:43:59 +0700285 /* p->util is skip-worktree */
286 if (p->util)
Nguyễn Thái Ngọc Duyb4d16902009-08-20 20:46:58 +0700287 continue;
Linus Torvaldsd177cab2008-05-09 09:11:43 -0700288
Johannes Schindelinc455c872008-07-21 19:03:49 +0100289 if (!lstat(p->string, &st)) {
290 if (add_to_cache(p->string, &st, 0))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000291 die(_("updating files failed"));
Alex Riesen960b8ad2008-05-12 19:57:45 +0200292 } else
Johannes Schindelinc455c872008-07-21 19:03:49 +0100293 remove_file_from_cache(p->string);
Junio C Hamano28886052007-11-18 01:52:55 -0800294 }
295}
296
Junio C Hamano06bb6432011-08-19 11:58:18 -0700297static void create_base_index(const struct commit *current_head)
Linus Torvaldsfa9dcf82008-01-13 00:30:56 -0800298{
299 struct tree *tree;
300 struct unpack_trees_options opts;
301 struct tree_desc t;
302
Junio C Hamano06bb6432011-08-19 11:58:18 -0700303 if (!current_head) {
Linus Torvaldsfa9dcf82008-01-13 00:30:56 -0800304 discard_cache();
305 return;
306 }
307
308 memset(&opts, 0, sizeof(opts));
309 opts.head_idx = 1;
310 opts.index_only = 1;
311 opts.merge = 1;
Linus Torvalds34110cd2008-03-06 18:12:28 -0800312 opts.src_index = &the_index;
313 opts.dst_index = &the_index;
Linus Torvaldsfa9dcf82008-01-13 00:30:56 -0800314
315 opts.fn = oneway_merge;
brian m. carlsona9dbc172017-05-06 22:10:37 +0000316 tree = parse_tree_indirect(&current_head->object.oid);
Linus Torvaldsfa9dcf82008-01-13 00:30:56 -0800317 if (!tree)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000318 die(_("failed to unpack HEAD tree object"));
Linus Torvaldsfa9dcf82008-01-13 00:30:56 -0800319 parse_tree(tree);
320 init_tree_desc(&t, tree->buffer, tree->size);
Daniel Barkalow203a2fe2008-02-07 11:39:48 -0500321 if (unpack_trees(1, &t, &opts))
322 exit(128); /* We've already reported the error, finish dying */
Linus Torvaldsfa9dcf82008-01-13 00:30:56 -0800323}
324
Matthieu Moyd38a30d2010-01-12 10:54:44 +0100325static void refresh_cache_or_die(int refresh_flags)
326{
327 /*
328 * refresh_flags contains REFRESH_QUIET, so the only errors
329 * are for unmerged entries.
330 */
331 if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
332 die_resolve_conflict("commit");
333}
334
Michael Haggerty35ff08b2014-10-01 12:28:17 +0200335static const char *prepare_index(int argc, const char **argv, const char *prefix,
336 const struct commit *current_head, int is_status)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500337{
Martin Ågrendd1055e2017-09-23 01:34:49 +0200338 struct string_list partial = STRING_LIST_INIT_DUP;
Nguyễn Thái Ngọc Duy6654c882013-07-14 15:35:38 +0700339 struct pathspec pathspec;
Junio C Hamano50b7e702009-08-04 23:49:33 -0700340 int refresh_flags = REFRESH_QUIET;
Michael Haggertyb4fb09e2015-08-10 11:47:39 +0200341 const char *ret;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500342
Junio C Hamano50b7e702009-08-04 23:49:33 -0700343 if (is_status)
344 refresh_flags |= REFRESH_UNMERGED;
Nguyễn Thái Ngọc Duy6654c882013-07-14 15:35:38 +0700345 parse_pathspec(&pathspec, 0,
346 PATHSPEC_PREFER_FULL,
347 prefix, argv);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500348
Nguyễn Thái Ngọc Duy5ab2a2d2013-07-14 15:35:49 +0700349 if (read_cache_preload(&pathspec) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000350 die(_("index file corrupt"));
Linus Torvalds671c9b72008-11-13 16:36:30 -0800351
Conrad Irwin1020d082011-05-06 22:59:59 -0700352 if (interactive) {
Elia Pintoe23fd152014-01-30 07:15:56 -0800353 char *old_index_env = NULL;
Junio C Hamanob3e83cc2016-12-07 10:33:54 -0800354 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
Conrad Irwin1020d082011-05-06 22:59:59 -0700355
356 refresh_cache_or_die(refresh_flags);
357
Martin Ågren812d6b02017-10-06 22:12:12 +0200358 if (write_locked_index(&the_index, &index_lock, 0))
Conrad Irwin1020d082011-05-06 22:59:59 -0700359 die(_("unable to create temporary index"));
360
361 old_index_env = getenv(INDEX_ENVIRONMENT);
Michael Haggertyb4fb09e2015-08-10 11:47:39 +0200362 setenv(INDEX_ENVIRONMENT, get_lock_file_path(&index_lock), 1);
Conrad Irwin1020d082011-05-06 22:59:59 -0700363
Conrad Irwinb4bd4662011-05-07 10:58:07 -0700364 if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
Conrad Irwin1020d082011-05-06 22:59:59 -0700365 die(_("interactive add failed"));
366
367 if (old_index_env && *old_index_env)
368 setenv(INDEX_ENVIRONMENT, old_index_env, 1);
369 else
370 unsetenv(INDEX_ENVIRONMENT);
371
372 discard_cache();
Michael Haggertyb4fb09e2015-08-10 11:47:39 +0200373 read_cache_from(get_lock_file_path(&index_lock));
David Turner9c4d6c02014-07-13 13:28:19 -0700374 if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) {
Junio C Hamano3fd13cb2014-09-11 10:33:32 -0700375 if (reopen_lock_file(&index_lock) < 0)
David Turner9c4d6c02014-07-13 13:28:19 -0700376 die(_("unable to write index file"));
Martin Ågren812d6b02017-10-06 22:12:12 +0200377 if (write_locked_index(&the_index, &index_lock, 0))
Junio C Hamano3fd13cb2014-09-11 10:33:32 -0700378 die(_("unable to update temporary index"));
David Turner9c4d6c02014-07-13 13:28:19 -0700379 } else
380 warning(_("Failed to update main cache tree"));
Conrad Irwin1020d082011-05-06 22:59:59 -0700381
382 commit_style = COMMIT_NORMAL;
Martin Ågrendd1055e2017-09-23 01:34:49 +0200383 ret = get_lock_file_path(&index_lock);
384 goto out;
Conrad Irwin1020d082011-05-06 22:59:59 -0700385 }
386
Junio C Hamano28886052007-11-18 01:52:55 -0800387 /*
388 * Non partial, non as-is commit.
389 *
390 * (1) get the real index;
391 * (2) update the_index as necessary;
392 * (3) write the_index out to the real index (still locked);
393 * (4) return the name of the locked index file.
394 *
395 * The caller should run hooks on the locked real index, and
396 * (A) if all goes well, commit the real index;
397 * (B) on failure, rollback the real index.
398 */
Nguyễn Thái Ngọc Duy6654c882013-07-14 15:35:38 +0700399 if (all || (also && pathspec.nr)) {
Junio C Hamanob3e83cc2016-12-07 10:33:54 -0800400 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
Thomas Gummerer610d55a2016-09-14 22:07:47 +0100401 add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
Matthieu Moyd38a30d2010-01-12 10:54:44 +0100402 refresh_cache_or_die(refresh_flags);
Nguyễn Thái Ngọc Duye859c692012-01-16 09:36:46 +0700403 update_main_cache_tree(WRITE_TREE_SILENT);
Martin Ågren812d6b02017-10-06 22:12:12 +0200404 if (write_locked_index(&the_index, &index_lock, 0))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000405 die(_("unable to write new_index file"));
Junio C Hamano28886052007-11-18 01:52:55 -0800406 commit_style = COMMIT_NORMAL;
Martin Ågrendd1055e2017-09-23 01:34:49 +0200407 ret = get_lock_file_path(&index_lock);
408 goto out;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500409 }
410
Junio C Hamano28886052007-11-18 01:52:55 -0800411 /*
412 * As-is commit.
413 *
414 * (1) return the name of the real index file.
415 *
Markus Heidelberg73276232010-04-02 14:27:18 +0200416 * The caller should run hooks on the real index,
417 * and create commit from the_index.
Junio C Hamano28886052007-11-18 01:52:55 -0800418 * We still need to refresh the index here.
419 */
Nguyễn Thái Ngọc Duy6654c882013-07-14 15:35:38 +0700420 if (!only && !pathspec.nr) {
Junio C Hamanob3e83cc2016-12-07 10:33:54 -0800421 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
Matthieu Moyd38a30d2010-01-12 10:54:44 +0100422 refresh_cache_or_die(refresh_flags);
David Turner9c4d6c02014-07-13 13:28:19 -0700423 if (active_cache_changed
David Turner475a3442015-08-27 13:07:54 -0400424 || !cache_tree_fully_valid(active_cache_tree))
Nguyễn Thái Ngọc Duye859c692012-01-16 09:36:46 +0700425 update_main_cache_tree(WRITE_TREE_SILENT);
David Turner9c4d6c02014-07-13 13:28:19 -0700426 if (active_cache_changed) {
Nguyễn Thái Ngọc Duy03b86642014-06-13 19:19:23 +0700427 if (write_locked_index(&the_index, &index_lock,
428 COMMIT_LOCK))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000429 die(_("unable to write new_index file"));
Junio C Hamanod5f5d0a2010-07-06 21:53:11 -0700430 } else {
431 rollback_lock_file(&index_lock);
432 }
Junio C Hamano28886052007-11-18 01:52:55 -0800433 commit_style = COMMIT_AS_IS;
Martin Ågrendd1055e2017-09-23 01:34:49 +0200434 ret = get_index_file();
435 goto out;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500436 }
437
Junio C Hamano28886052007-11-18 01:52:55 -0800438 /*
439 * A partial commit.
440 *
441 * (0) find the set of affected paths;
442 * (1) get lock on the real index file;
443 * (2) update the_index with the given paths;
444 * (3) write the_index out to the real index (still locked);
445 * (4) get lock on the false index file;
446 * (5) reset the_index from HEAD;
447 * (6) update the_index the same way as (2);
448 * (7) write the_index out to the false index file;
449 * (8) return the name of the false index file (still locked);
450 *
451 * The caller should run hooks on the locked false index, and
452 * create commit from it. Then
453 * (A) if all goes well, commit the real index;
454 * (B) on failure, rollback the real index;
455 * In either case, rollback the false index.
456 */
457 commit_style = COMMIT_PARTIAL;
458
Ævar Arnfjörð Bjarmasonb0cea472012-04-30 15:33:13 +0000459 if (whence != FROM_COMMIT) {
460 if (whence == FROM_MERGE)
461 die(_("cannot do a partial commit during a merge."));
462 else if (whence == FROM_CHERRY_PICK)
463 die(_("cannot do a partial commit during a cherry-pick."));
464 }
Junio C Hamano28886052007-11-18 01:52:55 -0800465
Nguyễn Thái Ngọc Duy17ddc662013-07-14 15:35:53 +0700466 if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
Junio C Hamano28886052007-11-18 01:52:55 -0800467 exit(1);
468
469 discard_cache();
470 if (read_cache() < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000471 die(_("cannot read the index"));
Junio C Hamano28886052007-11-18 01:52:55 -0800472
Junio C Hamanob3e83cc2016-12-07 10:33:54 -0800473 hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
Junio C Hamano28886052007-11-18 01:52:55 -0800474 add_remove_files(&partial);
Kristian Høgsbergef12b502007-11-12 15:48:22 -0500475 refresh_cache(REFRESH_QUIET);
David Turner9c4d6c02014-07-13 13:28:19 -0700476 update_main_cache_tree(WRITE_TREE_SILENT);
Martin Ågren812d6b02017-10-06 22:12:12 +0200477 if (write_locked_index(&the_index, &index_lock, 0))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000478 die(_("unable to write new_index file"));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500479
Nguyễn Thái Ngọc Duy03b86642014-06-13 19:19:23 +0700480 hold_lock_file_for_update(&false_lock,
481 git_path("next-index-%"PRIuMAX,
482 (uintmax_t) getpid()),
483 LOCK_DIE_ON_ERROR);
Linus Torvaldsfa9dcf82008-01-13 00:30:56 -0800484
Junio C Hamano06bb6432011-08-19 11:58:18 -0700485 create_base_index(current_head);
Junio C Hamano28886052007-11-18 01:52:55 -0800486 add_remove_files(&partial);
Kristian Høgsbergd37d3202007-11-09 11:40:27 -0500487 refresh_cache(REFRESH_QUIET);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500488
Martin Ågren812d6b02017-10-06 22:12:12 +0200489 if (write_locked_index(&the_index, &false_lock, 0))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000490 die(_("unable to write temporary index file"));
Jeff King959ba672008-02-14 12:18:23 -0500491
492 discard_cache();
Michael Haggertyb4fb09e2015-08-10 11:47:39 +0200493 ret = get_lock_file_path(&false_lock);
494 read_cache_from(ret);
Martin Ågrendd1055e2017-09-23 01:34:49 +0200495out:
496 string_list_clear(&partial, 0);
497 clear_pathspec(&pathspec);
Michael Haggertyb4fb09e2015-08-10 11:47:39 +0200498 return ret;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500499}
500
Junio C Hamanod249b092009-08-09 21:59:30 -0700501static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
502 struct wt_status *s)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500503{
brian m. carlson8066df42017-02-20 00:10:14 +0000504 struct object_id oid;
Junio C Hamano76e2f7c2009-08-07 23:31:57 -0700505
Junio C Hamanod249b092009-08-09 21:59:30 -0700506 if (s->relative_paths)
507 s->prefix = prefix;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500508
509 if (amend) {
Junio C Hamanod249b092009-08-09 21:59:30 -0700510 s->amend = 1;
511 s->reference = "HEAD^1";
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500512 }
Junio C Hamanod249b092009-08-09 21:59:30 -0700513 s->verbose = verbose;
514 s->index_file = index_file;
515 s->fp = fp;
516 s->nowarn = nowarn;
brian m. carlsone82caf32017-07-13 23:49:28 +0000517 s->is_initial = get_oid(s->reference, &oid) ? 1 : 0;
Jeff Hostetlerd9fc7462016-08-11 10:45:59 -0400518 if (!s->is_initial)
brian m. carlson8066df42017-02-20 00:10:14 +0000519 hashcpy(s->sha1_commit, oid.hash);
Jeff Hostetlerbe7e7952016-08-05 18:00:27 -0400520 s->status_format = status_format;
521 s->ignore_submodule_arg = ignore_submodule_arg;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500522
Junio C Hamano76e2f7c2009-08-07 23:31:57 -0700523 wt_status_collect(s);
Jeff Hostetlerbe7e7952016-08-05 18:00:27 -0400524 wt_status_print(s);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500525
Junio C Hamanod249b092009-08-09 21:59:30 -0700526 return s->commitable;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500527}
528
Junio C Hamano06bb6432011-08-19 11:58:18 -0700529static int is_a_merge(const struct commit *current_head)
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100530{
Junio C Hamano06bb6432011-08-19 11:58:18 -0700531 return !!(current_head->parents && current_head->parents->next);
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100532}
533
Jeff Kingfac90832014-12-10 10:42:10 -0500534static void assert_split_ident(struct ident_split *id, const struct strbuf *buf)
535{
Jeff Kingc83a5092014-12-10 10:43:42 -0500536 if (split_ident_line(id, buf->buf, buf->len) || !id->date_begin)
Jeff Kingfac90832014-12-10 10:42:10 -0500537 die("BUG: unable to parse our own ident: %s", buf->buf);
538}
539
Junio C Hamano7dfe8ad2012-03-11 03:12:10 -0700540static void export_one(const char *var, const char *s, const char *e, int hack)
541{
542 struct strbuf buf = STRBUF_INIT;
543 if (hack)
544 strbuf_addch(&buf, hack);
545 strbuf_addf(&buf, "%.*s", (int)(e - s), s);
546 setenv(var, buf.buf, 1);
547 strbuf_release(&buf);
548}
549
Jeff Kingc33ddc22014-08-27 03:57:08 -0400550static int parse_force_date(const char *in, struct strbuf *out)
Jeff King14ac2862014-05-01 21:12:42 -0400551{
Jeff Kingc33ddc22014-08-27 03:57:08 -0400552 strbuf_addch(out, '@');
Jeff King14ac2862014-05-01 21:12:42 -0400553
Jeff Kingc33ddc22014-08-27 03:57:08 -0400554 if (parse_date(in, out) < 0) {
Jeff King14ac2862014-05-01 21:12:42 -0400555 int errors = 0;
556 unsigned long t = approxidate_careful(in, &errors);
557 if (errors)
558 return -1;
Jeff Kingc33ddc22014-08-27 03:57:08 -0400559 strbuf_addf(out, "%lu", t);
Jeff King14ac2862014-05-01 21:12:42 -0400560 }
561
562 return 0;
563}
564
Jeff Kingf4ef5172014-08-27 03:57:56 -0400565static void set_ident_var(char **buf, char *val)
566{
567 free(*buf);
568 *buf = val;
569}
570
Junio C Hamano4c28e4a2010-12-20 17:00:36 -0800571static void determine_author_info(struct strbuf *author_ident)
Santi Béjara45d46b2008-05-04 18:04:49 +0200572{
573 char *name, *email, *date;
Junio C Hamano7dfe8ad2012-03-11 03:12:10 -0700574 struct ident_split author;
Santi Béjara45d46b2008-05-04 18:04:49 +0200575
Jeff Kingeaa541e2015-01-12 20:58:33 -0500576 name = xstrdup_or_null(getenv("GIT_AUTHOR_NAME"));
577 email = xstrdup_or_null(getenv("GIT_AUTHOR_EMAIL"));
578 date = xstrdup_or_null(getenv("GIT_AUTHOR_DATE"));
Santi Béjara45d46b2008-05-04 18:04:49 +0200579
Jay Soffian37f7a852011-02-19 23:12:29 -0500580 if (author_message) {
Jeff Kingf0f96622014-08-27 03:57:28 -0400581 struct ident_split ident;
Junio C Hamano2c733fb2012-02-02 13:41:43 -0800582 size_t len;
Jeff Kingf0f96622014-08-27 03:57:28 -0400583 const char *a;
Santi Béjara45d46b2008-05-04 18:04:49 +0200584
Jeff Kingf0f96622014-08-27 03:57:28 -0400585 a = find_commit_header(author_message_buffer, "author", &len);
Santi Béjara45d46b2008-05-04 18:04:49 +0200586 if (!a)
Jeff Kingf0f96622014-08-27 03:57:28 -0400587 die(_("commit '%s' lacks author header"), author_message);
588 if (split_ident_line(&ident, a, len) < 0)
589 die(_("commit '%s' has malformed author line"), author_message);
Santi Béjara45d46b2008-05-04 18:04:49 +0200590
Jeff Kingf4ef5172014-08-27 03:57:56 -0400591 set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
592 set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
Santi Béjara45d46b2008-05-04 18:04:49 +0200593
Jeff Kingf0f96622014-08-27 03:57:28 -0400594 if (ident.date_begin) {
Jeff Kingf4ef5172014-08-27 03:57:56 -0400595 struct strbuf date_buf = STRBUF_INIT;
Jeff Kingf0f96622014-08-27 03:57:28 -0400596 strbuf_addch(&date_buf, '@');
597 strbuf_add(&date_buf, ident.date_begin, ident.date_end - ident.date_begin);
598 strbuf_addch(&date_buf, ' ');
599 strbuf_add(&date_buf, ident.tz_begin, ident.tz_end - ident.tz_begin);
Jeff Kingf4ef5172014-08-27 03:57:56 -0400600 set_ident_var(&date, strbuf_detach(&date_buf, NULL));
Jeff Kingf0f96622014-08-27 03:57:28 -0400601 }
Santi Béjara45d46b2008-05-04 18:04:49 +0200602 }
603
604 if (force_author) {
Jeff Kingf0f96622014-08-27 03:57:28 -0400605 struct ident_split ident;
Santi Béjara45d46b2008-05-04 18:04:49 +0200606
Jeff Kingf0f96622014-08-27 03:57:28 -0400607 if (split_ident_line(&ident, force_author, strlen(force_author)) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000608 die(_("malformed --author parameter"));
Jeff Kingf4ef5172014-08-27 03:57:56 -0400609 set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
610 set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
Santi Béjara45d46b2008-05-04 18:04:49 +0200611 }
612
Jeff King14ac2862014-05-01 21:12:42 -0400613 if (force_date) {
Jeff Kingf4ef5172014-08-27 03:57:56 -0400614 struct strbuf date_buf = STRBUF_INIT;
Jeff Kingc33ddc22014-08-27 03:57:08 -0400615 if (parse_force_date(force_date, &date_buf))
Jeff King14ac2862014-05-01 21:12:42 -0400616 die(_("invalid date format: %s"), force_date);
Jeff Kingf4ef5172014-08-27 03:57:56 -0400617 set_ident_var(&date, strbuf_detach(&date_buf, NULL));
Jeff King14ac2862014-05-01 21:12:42 -0400618 }
619
Jeff Kingf9bc5732012-05-24 19:28:40 -0400620 strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
Jeff Kingc83a5092014-12-10 10:43:42 -0500621 assert_split_ident(&author, author_ident);
622 export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
623 export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
624 export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
Jeff Kingf4ef5172014-08-27 03:57:56 -0400625 free(name);
626 free(email);
627 free(date);
Santi Béjara45d46b2008-05-04 18:04:49 +0200628}
629
Jeff Kingb7242b82014-05-01 21:10:01 -0400630static int author_date_is_interesting(void)
631{
632 return author_message || force_date;
Junio C Hamano4c28e4a2010-12-20 17:00:36 -0800633}
634
Nguyễn Thái Ngọc Duy84c9dc22014-05-17 08:52:23 +0700635static void adjust_comment_line_char(const struct strbuf *sb)
636{
637 char candidates[] = "#;@!$%^&|:";
638 char *candidate;
639 const char *p;
640
641 comment_line_char = candidates[0];
642 if (!memchr(sb->buf, comment_line_char, sb->len))
643 return;
644
645 p = sb->buf;
646 candidate = strchr(candidates, *p);
647 if (candidate)
648 *candidate = ' ';
649 for (p = sb->buf; *p; p++) {
650 if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
651 candidate = strchr(candidates, p[1]);
652 if (candidate)
653 *candidate = ' ';
654 }
655 }
656
657 for (p = candidates; *p == ' '; p++)
658 ;
659 if (!*p)
660 die(_("unable to select a comment character that is not used\n"
661 "in the current commit message"));
662 comment_line_char = *p;
663}
664
Junio C Hamanod249b092009-08-09 21:59:30 -0700665static int prepare_to_commit(const char *index_file, const char *prefix,
Junio C Hamano06bb6432011-08-19 11:58:18 -0700666 struct commit *current_head,
Junio C Hamano4c28e4a2010-12-20 17:00:36 -0800667 struct wt_status *s,
668 struct strbuf *author_ident)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500669{
670 struct stat statbuf;
Junio C Hamano4c28e4a2010-12-20 17:00:36 -0800671 struct strbuf committer_ident = STRBUF_INIT;
Elia Pintoe23fd152014-01-30 07:15:56 -0800672 int commitable;
Brandon Caseyf285a2d2008-10-09 14:12:12 -0500673 struct strbuf sb = STRBUF_INIT;
Paolo Bonzini8089c852008-02-05 08:04:18 +0100674 const char *hook_arg1 = NULL;
675 const char *hook_arg2 = NULL;
Boris Faure8b1ae672011-05-08 12:31:02 +0200676 int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
Matthieu Moy2556b992013-09-06 19:43:07 +0200677 int old_display_comment_prefix;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500678
Junio C Hamano7dfe8ad2012-03-11 03:12:10 -0700679 /* This checks and barfs if author is badly specified */
680 determine_author_info(author_ident);
681
Benoit Pierre15048f82014-03-18 11:00:53 +0100682 if (!no_verify && run_commit_hook(use_editor, index_file, "pre-commit", NULL))
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100683 return 0;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500684
Pat Notz89ac1222010-11-02 13:59:11 -0600685 if (squash_message) {
686 /*
687 * Insert the proper subject line before other commit
688 * message options add their content.
689 */
690 if (use_message && !strcmp(use_message, squash_message))
691 strbuf_addstr(&sb, "squash! ");
692 else {
693 struct pretty_print_context ctx = {0};
694 struct commit *c;
695 c = lookup_commit_reference_by_name(squash_message);
696 if (!c)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000697 die(_("could not lookup commit %s"), squash_message);
Pat Notz89ac1222010-11-02 13:59:11 -0600698 ctx.output_encoding = get_commit_output_encoding();
699 format_commit_message(c, "squash! %s\n\n", &sb,
700 &ctx);
701 }
702 }
703
Ævar Arnfjörð Bjarmason30884c92017-12-22 20:41:52 +0000704 if (have_option_m && !fixup_message) {
Johannes Schindelinf9568532007-11-11 17:36:39 +0000705 strbuf_addbuf(&sb, &message);
Paolo Bonzini8089c852008-02-05 08:04:18 +0100706 hook_arg1 = "message";
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500707 } else if (logfile && !strcmp(logfile, "-")) {
708 if (isatty(0))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000709 fprintf(stderr, _("(reading log message from standard input)\n"));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500710 if (strbuf_read(&sb, 0, 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000711 die_errno(_("could not read log from standard input"));
Paolo Bonzini8089c852008-02-05 08:04:18 +0100712 hook_arg1 = "message";
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500713 } else if (logfile) {
714 if (strbuf_read_file(&sb, logfile, 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000715 die_errno(_("could not read log file '%s'"),
Thomas Rastd824cbb2009-06-27 17:58:46 +0200716 logfile);
Paolo Bonzini8089c852008-02-05 08:04:18 +0100717 hook_arg1 = "message";
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500718 } else if (use_message) {
Elia Pintoe23fd152014-01-30 07:15:56 -0800719 char *buffer;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500720 buffer = strstr(use_message_buffer, "\n\n");
Jeff King076cbd62014-04-25 19:11:15 -0400721 if (buffer)
Johannes Schindelin84e213a2016-06-29 16:14:42 +0200722 strbuf_addstr(&sb, skip_blank_lines(buffer + 2));
Paolo Bonzini8089c852008-02-05 08:04:18 +0100723 hook_arg1 = "commit";
724 hook_arg2 = use_message;
Pat Notzd71b8ba2010-11-02 13:59:09 -0600725 } else if (fixup_message) {
726 struct pretty_print_context ctx = {0};
727 struct commit *commit;
728 commit = lookup_commit_reference_by_name(fixup_message);
729 if (!commit)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000730 die(_("could not lookup commit %s"), fixup_message);
Pat Notzd71b8ba2010-11-02 13:59:09 -0600731 ctx.output_encoding = get_commit_output_encoding();
732 format_commit_message(commit, "fixup! %s\n\n",
733 &sb, &ctx);
Ævar Arnfjörð Bjarmason30884c92017-12-22 20:41:52 +0000734 if (have_option_m)
735 strbuf_addbuf(&sb, &message);
Pat Notzd71b8ba2010-11-02 13:59:09 -0600736 hook_arg1 = "message";
Jeff Kingf9327292015-08-10 05:38:57 -0400737 } else if (!stat(git_path_merge_msg(), &statbuf)) {
Sven Strickrothb64c1e02016-03-21 23:29:40 +0100738 /*
739 * prepend SQUASH_MSG here if it exists and a
740 * "merge --squash" was originally performed
741 */
742 if (!stat(git_path_squash_msg(), &statbuf)) {
743 if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
744 die_errno(_("could not read SQUASH_MSG"));
745 hook_arg1 = "squash";
746 } else
747 hook_arg1 = "merge";
Jeff Kingf9327292015-08-10 05:38:57 -0400748 if (strbuf_read_file(&sb, git_path_merge_msg(), 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000749 die_errno(_("could not read MERGE_MSG"));
Jeff Kingf9327292015-08-10 05:38:57 -0400750 } else if (!stat(git_path_squash_msg(), &statbuf)) {
751 if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000752 die_errno(_("could not read SQUASH_MSG"));
Paolo Bonzini8089c852008-02-05 08:04:18 +0100753 hook_arg1 = "squash";
Jonathan Nieder2140b142011-02-25 03:07:57 -0600754 } else if (template_file) {
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500755 if (strbuf_read_file(&sb, template_file, 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000756 die_errno(_("could not read '%s'"), template_file);
Paolo Bonzini8089c852008-02-05 08:04:18 +0100757 hook_arg1 = "template";
Boris Faure8b1ae672011-05-08 12:31:02 +0200758 clean_message_contents = 0;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500759 }
760
Paolo Bonzini8089c852008-02-05 08:04:18 +0100761 /*
Jay Soffian37f7a852011-02-19 23:12:29 -0500762 * The remaining cases don't modify the template message, but
763 * just set the argument(s) to the prepare-commit-msg hook.
Paolo Bonzini8089c852008-02-05 08:04:18 +0100764 */
Jay Soffian37f7a852011-02-19 23:12:29 -0500765 else if (whence == FROM_MERGE)
Paolo Bonzini8089c852008-02-05 08:04:18 +0100766 hook_arg1 = "merge";
Jay Soffian37f7a852011-02-19 23:12:29 -0500767 else if (whence == FROM_CHERRY_PICK) {
768 hook_arg1 = "commit";
769 hook_arg2 = "CHERRY_PICK_HEAD";
770 }
Paolo Bonzini8089c852008-02-05 08:04:18 +0100771
Pat Notz89ac1222010-11-02 13:59:11 -0600772 if (squash_message) {
773 /*
774 * If squash_commit was used for the commit subject,
775 * then we're possibly hijacking other commit log options.
776 * Reset the hook args to tell the real story.
777 */
778 hook_arg1 = "message";
779 hook_arg2 = "";
780 }
781
Pranit Bauvae51b0df2016-05-25 00:49:50 +0530782 s->fp = fopen_for_writing(git_path_commit_editmsg());
Jonathan Nieder37f30122011-02-25 23:10:49 -0600783 if (s->fp == NULL)
Pranit Bauvae51b0df2016-05-25 00:49:50 +0530784 die_errno(_("could not open '%s'"), git_path_commit_editmsg());
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500785
Matthieu Moy2556b992013-09-06 19:43:07 +0200786 /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
787 old_display_comment_prefix = s->display_comment_prefix;
788 s->display_comment_prefix = 1;
789
Matthieu Moyea9882b2013-09-12 12:50:06 +0200790 /*
791 * Most hints are counter-productive when the commit has
792 * already started.
793 */
794 s->hints = 0;
795
Boris Faure8b1ae672011-05-08 12:31:02 +0200796 if (clean_message_contents)
Tobias Klauser63af4a82015-10-16 17:16:42 +0200797 strbuf_stripspace(&sb, 0);
Johannes Schindelin13208572007-11-11 17:35:58 +0000798
Junio C Hamano073bd752014-10-28 12:44:09 -0700799 if (signoff)
Jonathan Tan710714a2016-11-02 10:29:17 -0700800 append_signoff(&sb, ignore_non_trailer(sb.buf, sb.len), 0);
Johannes Schindelin13208572007-11-11 17:35:58 +0000801
Jonathan Nieder37f30122011-02-25 23:10:49 -0600802 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000803 die_errno(_("could not write commit template"));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500804
Nguyễn Thái Ngọc Duy84c9dc22014-05-17 08:52:23 +0700805 if (auto_comment_line_char)
806 adjust_comment_line_char(&sb);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500807 strbuf_release(&sb);
808
Santi Béjarbb1ae3f2008-05-04 18:04:51 +0200809 /* This checks if committer ident is explicitly given */
Jeff Kingf20f3872012-07-23 14:50:35 -0400810 strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
James P. Howard, IIbed575e2009-12-07 17:45:27 -0500811 if (use_editor && include_status) {
Elia Pintoe23fd152014-01-30 07:15:56 -0800812 int ident_shown = 0;
813 int saved_color_setting;
Jeff King47010262014-05-01 21:06:57 -0400814 struct ident_split ci, ai;
815
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +0700816 if (whence != FROM_COMMIT) {
817 if (cleanup_mode == CLEANUP_SCISSORS)
818 wt_status_add_cut_line(s->fp);
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600819 status_printf_ln(s, GIT_COLOR_NORMAL,
Ævar Arnfjörð Bjarmasonb0cea472012-04-30 15:33:13 +0000820 whence == FROM_MERGE
821 ? _("\n"
822 "It looks like you may be committing a merge.\n"
823 "If this is not correct, please remove the file\n"
824 " %s\n"
825 "and try again.\n")
826 : _("\n"
827 "It looks like you may be committing a cherry-pick.\n"
828 "If this is not correct, please remove the file\n"
829 " %s\n"
830 "and try again.\n"),
Jeff Kingca03e062017-04-20 17:08:54 -0400831 whence == FROM_MERGE ?
832 git_path_merge_head() :
833 git_path_cherry_pick_head());
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +0700834 }
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100835
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600836 fprintf(s->fp, "\n");
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100837 if (cleanup_mode == CLEANUP_ALL)
Ævar Arnfjörð Bjarmason4064e662012-04-30 15:33:14 +0000838 status_printf(s, GIT_COLOR_NORMAL,
839 _("Please enter the commit message for your changes."
Junio C Hamanoeff80a92013-01-16 20:18:48 +0100840 " Lines starting\nwith '%c' will be ignored, and an empty"
841 " message aborts the commit.\n"), comment_line_char);
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +0700842 else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
843 wt_status_add_cut_line(s->fp);
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100844 else /* CLEANUP_SPACE, that is. */
Ævar Arnfjörð Bjarmason4064e662012-04-30 15:33:14 +0000845 status_printf(s, GIT_COLOR_NORMAL,
846 _("Please enter the commit message for your changes."
Junio C Hamanoeff80a92013-01-16 20:18:48 +0100847 " Lines starting\n"
848 "with '%c' will be kept; you may remove them"
849 " yourself if you want to.\n"
850 "An empty message aborts the commit.\n"), comment_line_char);
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100851
Jeff Kingfac90832014-12-10 10:42:10 -0500852 /*
853 * These should never fail because they come from our own
854 * fmt_ident. They may fail the sane_ident test, but we know
855 * that the name and mail pointers will at least be valid,
856 * which is enough for our tests and printing here.
857 */
858 assert_split_ident(&ai, author_ident);
859 assert_split_ident(&ci, &committer_ident);
Jeff King47010262014-05-01 21:06:57 -0400860
861 if (ident_cmp(&ai, &ci))
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600862 status_printf_ln(s, GIT_COLOR_NORMAL,
Ævar Arnfjörð Bjarmasonfe8165c2011-02-22 23:41:46 +0000863 _("%s"
Jeff King47010262014-05-01 21:06:57 -0400864 "Author: %.*s <%.*s>"),
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600865 ident_shown++ ? "" : "\n",
Jeff King47010262014-05-01 21:06:57 -0400866 (int)(ai.name_end - ai.name_begin), ai.name_begin,
867 (int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
Santi Béjare83dbe82008-05-04 18:04:50 +0200868
Jeff Kingb7242b82014-05-01 21:10:01 -0400869 if (author_date_is_interesting())
870 status_printf_ln(s, GIT_COLOR_NORMAL,
871 _("%s"
872 "Date: %s"),
873 ident_shown++ ? "" : "\n",
Jeff Kinga5481a62015-06-25 12:55:02 -0400874 show_ident_date(&ai, DATE_MODE(NORMAL)));
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100875
Jeff Kingd6991ce2012-11-14 16:34:13 -0800876 if (!committer_ident_sufficiently_given())
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600877 status_printf_ln(s, GIT_COLOR_NORMAL,
Ævar Arnfjörð Bjarmasonfe8165c2011-02-22 23:41:46 +0000878 _("%s"
Jeff King47010262014-05-01 21:06:57 -0400879 "Committer: %.*s <%.*s>"),
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600880 ident_shown++ ? "" : "\n",
Jeff King47010262014-05-01 21:06:57 -0400881 (int)(ci.name_end - ci.name_begin), ci.name_begin,
882 (int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
Santi Béjarbb1ae3f2008-05-04 18:04:51 +0200883
Kaartic Sivaraamb3cf1b72017-06-30 17:42:21 +0530884 status_printf_ln(s, GIT_COLOR_NORMAL, "%s", ""); /* Add new line for clarity */
Santi Béjarbb1ae3f2008-05-04 18:04:51 +0200885
Junio C Hamanod249b092009-08-09 21:59:30 -0700886 saved_color_setting = s->use_color;
887 s->use_color = 0;
Jonathan Nieder37f30122011-02-25 23:10:49 -0600888 commitable = run_status(s->fp, index_file, prefix, 1, s);
Junio C Hamanod249b092009-08-09 21:59:30 -0700889 s->use_color = saved_color_setting;
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100890 } else {
brian m. carlson8066df42017-02-20 00:10:14 +0000891 struct object_id oid;
Junio C Hamanofbcf1182007-12-19 19:23:03 -0800892 const char *parent = "HEAD";
Alex Riesen71686242007-11-28 22:13:08 +0100893
Alex Riesen71686242007-11-28 22:13:08 +0100894 if (!active_nr && read_cache() < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000895 die(_("Cannot read index"));
Alex Riesen71686242007-11-28 22:13:08 +0100896
Junio C Hamanofbcf1182007-12-19 19:23:03 -0800897 if (amend)
898 parent = "HEAD^1";
899
brian m. carlsone82caf32017-07-13 23:49:28 +0000900 if (get_oid(parent, &oid)) {
Nguyễn Thái Ngọc Duy2c49f7f2016-10-24 17:42:22 +0700901 int i, ita_nr = 0;
902
903 for (i = 0; i < active_nr; i++)
904 if (ce_intent_to_add(active_cache[i]))
905 ita_nr++;
906 commitable = active_nr - ita_nr > 0;
907 } else {
Jens Lehmannc215d3d2014-04-05 18:59:36 +0200908 /*
909 * Unless the user did explicitly request a submodule
910 * ignore mode by passing a command line option we do
911 * not ignore any changed submodule SHA-1s when
912 * comparing index and parent, no matter what is
913 * configured. Otherwise we won't commit any
914 * submodules which were manually staged, which would
915 * be really confusing.
916 */
Brandon Williams02f2f562017-10-31 11:19:05 -0700917 struct diff_flags flags = DIFF_FLAGS_INIT;
Brandon Williams0d1e0e72017-10-31 11:19:11 -0700918 flags.override_submodule_config = 1;
Jens Lehmannc215d3d2014-04-05 18:59:36 +0200919 if (ignore_submodule_arg &&
920 !strcmp(ignore_submodule_arg, "all"))
Brandon Williams0d1e0e72017-10-31 11:19:11 -0700921 flags.ignore_submodules = 1;
Brandon Williams02f2f562017-10-31 11:19:05 -0700922 commitable = index_differs_from(parent, &flags, 1);
Jens Lehmannc215d3d2014-04-05 18:59:36 +0200923 }
Alex Riesen71686242007-11-28 22:13:08 +0100924 }
Junio C Hamano4c28e4a2010-12-20 17:00:36 -0800925 strbuf_release(&committer_ident);
Alex Riesen71686242007-11-28 22:13:08 +0100926
Jonathan Nieder37f30122011-02-25 23:10:49 -0600927 fclose(s->fp);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500928
Jay Soffian37f7a852011-02-19 23:12:29 -0500929 /*
930 * Reject an attempt to record a non-merge empty commit without
931 * explicit --allow-empty. In the cherry-pick case, it may be
932 * empty due to conflict resolution, which the user should okay.
933 */
934 if (!commitable && whence != FROM_MERGE && !allow_empty &&
Junio C Hamano06bb6432011-08-19 11:58:18 -0700935 !(amend && is_a_merge(current_head))) {
Matthieu Moy2556b992013-09-06 19:43:07 +0200936 s->display_comment_prefix = old_display_comment_prefix;
Junio C Hamanod249b092009-08-09 21:59:30 -0700937 run_status(stdout, index_file, prefix, 0, s);
Jeff Kingf197ed22010-06-06 20:41:46 -0400938 if (amend)
Ævar Arnfjörð Bjarmasonfc88e312011-02-22 23:41:49 +0000939 fputs(_(empty_amend_advice), stderr);
Jeff Kingc17592a2013-07-26 19:39:28 -0400940 else if (whence == FROM_CHERRY_PICK) {
Junio C Hamano6c80cd22011-04-01 17:55:55 -0700941 fputs(_(empty_cherry_pick_advice), stderr);
Jeff Kingc17592a2013-07-26 19:39:28 -0400942 if (!sequencer_in_use)
943 fputs(_(empty_cherry_pick_advice_single), stderr);
944 else
945 fputs(_(empty_cherry_pick_advice_multi), stderr);
946 }
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100947 return 0;
948 }
949
Kevin Willford680ee552017-08-14 15:54:25 -0600950 if (!no_verify && find_hook("pre-commit")) {
951 /*
952 * Re-read the index as pre-commit hook could have updated it,
953 * and write it out as a tree. We must do this before we invoke
954 * the editor and after we invoke run_status above.
955 */
956 discard_cache();
957 }
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100958 read_cache_from(index_file);
Kevin Willford680ee552017-08-14 15:54:25 -0600959
Thomas Rast996277c2011-12-06 18:43:37 +0100960 if (update_main_cache_tree(0)) {
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000961 error(_("Error building trees"));
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100962 return 0;
963 }
964
Benoit Pierre15048f82014-03-18 11:00:53 +0100965 if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
Pranit Bauvae51b0df2016-05-25 00:49:50 +0530966 git_path_commit_editmsg(), hook_arg1, hook_arg2, NULL))
Paolo Bonzini8089c852008-02-05 08:04:18 +0100967 return 0;
968
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100969 if (use_editor) {
Elia Pinto8d7aa4b2017-01-13 17:58:00 +0000970 struct argv_array env = ARGV_ARRAY_INIT;
971
972 argv_array_pushf(&env, "GIT_INDEX_FILE=%s", index_file);
973 if (launch_editor(git_path_commit_editmsg(), NULL, env.argv)) {
Stephan Beyer71982032008-07-25 18:28:42 +0200974 fprintf(stderr,
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000975 _("Please supply the message using either -m or -F option.\n"));
Stephan Beyer71982032008-07-25 18:28:42 +0200976 exit(1);
977 }
Elia Pinto8d7aa4b2017-01-13 17:58:00 +0000978 argv_array_clear(&env);
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100979 }
980
981 if (!no_verify &&
Pranit Bauvae51b0df2016-05-25 00:49:50 +0530982 run_commit_hook(use_editor, index_file, "commit-msg", git_path_commit_editmsg(), NULL)) {
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100983 return 0;
984 }
985
986 return 1;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500987}
988
Junio C Hamanob2eda9b2012-03-30 12:14:33 -0700989static int rest_is_empty(struct strbuf *sb, int start)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500990{
Junio C Hamanob2eda9b2012-03-30 12:14:33 -0700991 int i, eol;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500992 const char *nl;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500993
Kaartic Sivaraam669638f2017-07-06 08:49:57 +0530994 /* Check if the rest is just whitespace and Signed-off-by's. */
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500995 for (i = start; i < sb->len; i++) {
996 nl = memchr(sb->buf + i, '\n', sb->len - i);
997 if (nl)
998 eol = nl - sb->buf;
999 else
1000 eol = sb->len;
1001
1002 if (strlen(sign_off_header) <= eol - i &&
Christian Couder59556542013-11-30 21:55:40 +01001003 starts_with(sb->buf + i, sign_off_header)) {
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001004 i = eol;
1005 continue;
1006 }
1007 while (i < eol)
1008 if (!isspace(sb->buf[i++]))
1009 return 0;
1010 }
1011
1012 return 1;
1013}
1014
Junio C Hamanob2eda9b2012-03-30 12:14:33 -07001015/*
1016 * Find out if the message in the strbuf contains only whitespace and
1017 * Signed-off-by lines.
1018 */
1019static int message_is_empty(struct strbuf *sb)
1020{
1021 if (cleanup_mode == CLEANUP_NONE && sb->len)
1022 return 0;
1023 return rest_is_empty(sb, 0);
1024}
1025
1026/*
1027 * See if the user edited the message in the editor or left what
1028 * was in the template intact
1029 */
1030static int template_untouched(struct strbuf *sb)
1031{
1032 struct strbuf tmpl = STRBUF_INIT;
Jeff Kingcf4fff52014-06-18 15:44:19 -04001033 const char *start;
Junio C Hamanob2eda9b2012-03-30 12:14:33 -07001034
1035 if (cleanup_mode == CLEANUP_NONE && sb->len)
1036 return 0;
1037
1038 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1039 return 0;
1040
Tobias Klauser63af4a82015-10-16 17:16:42 +02001041 strbuf_stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
Jeff Kingcf4fff52014-06-18 15:44:19 -04001042 if (!skip_prefix(sb->buf, tmpl.buf, &start))
Junio C Hamanob2eda9b2012-03-30 12:14:33 -07001043 start = sb->buf;
1044 strbuf_release(&tmpl);
1045 return rest_is_empty(sb, start - sb->buf);
1046}
1047
Junio C Hamano146ea062008-08-26 23:13:13 -07001048static const char *find_author_by_nickname(const char *name)
1049{
1050 struct rev_info revs;
1051 struct commit *commit;
1052 struct strbuf buf = STRBUF_INIT;
Antoine Pelisseea167942013-08-23 15:48:31 +02001053 struct string_list mailmap = STRING_LIST_INIT_NODUP;
Junio C Hamano146ea062008-08-26 23:13:13 -07001054 const char *av[20];
1055 int ac = 0;
1056
1057 init_revisions(&revs, NULL);
1058 strbuf_addf(&buf, "--author=%s", name);
1059 av[++ac] = "--all";
1060 av[++ac] = "-i";
1061 av[++ac] = buf.buf;
1062 av[++ac] = NULL;
1063 setup_revisions(ac, av, &revs, NULL);
Antoine Pelisseea167942013-08-23 15:48:31 +02001064 revs.mailmap = &mailmap;
1065 read_mailmap(revs.mailmap, NULL);
1066
Stefan Beller81c3ce32014-08-10 23:33:26 +02001067 if (prepare_revision_walk(&revs))
1068 die(_("revision walk setup failed"));
Junio C Hamano146ea062008-08-26 23:13:13 -07001069 commit = get_revision(&revs);
1070 if (commit) {
Thomas Rastdd2e7942009-10-19 17:48:08 +02001071 struct pretty_print_context ctx = {0};
Jeff Kinga5481a62015-06-25 12:55:02 -04001072 ctx.date_mode.type = DATE_NORMAL;
Junio C Hamano146ea062008-08-26 23:13:13 -07001073 strbuf_release(&buf);
Antoine Pelisseea167942013-08-23 15:48:31 +02001074 format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
1075 clear_mailmap(&mailmap);
Junio C Hamano146ea062008-08-26 23:13:13 -07001076 return strbuf_detach(&buf, NULL);
1077 }
Michael J Gruber1044b1f2015-01-26 16:48:33 +01001078 die(_("--author '%s' is not 'Name <email>' and matches no existing author"), name);
Junio C Hamano146ea062008-08-26 23:13:13 -07001079}
1080
Jameson Millereec0f7f2017-10-30 13:21:37 -04001081static void handle_ignored_arg(struct wt_status *s)
1082{
1083 if (!ignored_arg)
1084 ; /* default already initialized */
1085 else if (!strcmp(ignored_arg, "traditional"))
1086 s->show_ignored_mode = SHOW_TRADITIONAL_IGNORED;
1087 else if (!strcmp(ignored_arg, "no"))
1088 s->show_ignored_mode = SHOW_NO_IGNORED;
1089 else if (!strcmp(ignored_arg, "matching"))
1090 s->show_ignored_mode = SHOW_MATCHING_IGNORED;
1091 else
1092 die(_("Invalid ignored mode '%s'"), ignored_arg);
1093}
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001094
1095static void handle_untracked_files_arg(struct wt_status *s)
1096{
1097 if (!untracked_files_arg)
1098 ; /* default already initialized */
1099 else if (!strcmp(untracked_files_arg, "no"))
1100 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1101 else if (!strcmp(untracked_files_arg, "normal"))
1102 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1103 else if (!strcmp(untracked_files_arg, "all"))
1104 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1105 else
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001106 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001107}
1108
Jay Soffian37f7a852011-02-19 23:12:29 -05001109static const char *read_commit_message(const char *name)
1110{
Jeff Kingdd0d3882013-01-26 04:44:06 -05001111 const char *out_enc;
Jay Soffian37f7a852011-02-19 23:12:29 -05001112 struct commit *commit;
1113
1114 commit = lookup_commit_reference_by_name(name);
1115 if (!commit)
Junio C Hamano6c80cd22011-04-01 17:55:55 -07001116 die(_("could not lookup commit %s"), name);
Jay Soffian37f7a852011-02-19 23:12:29 -05001117 out_enc = get_commit_output_encoding();
Nguyễn Thái Ngọc Duy5a10d232013-04-19 09:08:40 +10001118 return logmsg_reencode(commit, NULL, out_enc);
Jay Soffian37f7a852011-02-19 23:12:29 -05001119}
1120
Junio C Hamano84b42022013-06-24 11:41:40 -07001121/*
1122 * Enumerate what needs to be propagated when --porcelain
1123 * is not in effect here.
1124 */
1125static struct status_deferred_config {
Jeff Hostetlerbe7e7952016-08-05 18:00:27 -04001126 enum wt_status_format status_format;
Junio C Hamano84b42022013-06-24 11:41:40 -07001127 int show_branch;
1128} status_deferred_config = {
1129 STATUS_FORMAT_UNSPECIFIED,
1130 -1 /* unspecified */
1131};
1132
1133static void finalize_deferred_config(struct wt_status *s)
1134{
1135 int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
Jeff Hostetler1ecdecc2016-08-11 10:45:57 -04001136 status_format != STATUS_FORMAT_PORCELAIN_V2 &&
Junio C Hamano84b42022013-06-24 11:41:40 -07001137 !s->null_termination);
1138
1139 if (s->null_termination) {
1140 if (status_format == STATUS_FORMAT_NONE ||
1141 status_format == STATUS_FORMAT_UNSPECIFIED)
1142 status_format = STATUS_FORMAT_PORCELAIN;
1143 else if (status_format == STATUS_FORMAT_LONG)
1144 die(_("--long and -z are incompatible"));
1145 }
1146
1147 if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED)
1148 status_format = status_deferred_config.status_format;
1149 if (status_format == STATUS_FORMAT_UNSPECIFIED)
1150 status_format = STATUS_FORMAT_NONE;
1151
1152 if (use_deferred_config && s->show_branch < 0)
1153 s->show_branch = status_deferred_config.show_branch;
1154 if (s->show_branch < 0)
1155 s->show_branch = 0;
1156}
1157
Shawn Bohrer2f02b252007-12-02 23:02:09 -06001158static int parse_and_validate_options(int argc, const char *argv[],
Jeff King036dbbf2012-05-07 15:18:26 -04001159 const struct option *options,
Junio C Hamanodbd0f5c2008-08-06 11:43:47 -07001160 const char * const usage[],
Junio C Hamanod249b092009-08-09 21:59:30 -07001161 const char *prefix,
Junio C Hamano06bb6432011-08-19 11:58:18 -07001162 struct commit *current_head,
Junio C Hamanod249b092009-08-09 21:59:30 -07001163 struct wt_status *s)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001164{
1165 int f = 0;
1166
Jeff King036dbbf2012-05-07 15:18:26 -04001167 argc = parse_options(argc, argv, prefix, options, usage, 0);
Junio C Hamano84b42022013-06-24 11:41:40 -07001168 finalize_deferred_config(s);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001169
Junio C Hamano146ea062008-08-26 23:13:13 -07001170 if (force_author && !strchr(force_author, '>'))
1171 force_author = find_author_by_nickname(force_author);
1172
Erick Mattosc51f6ce2009-11-04 01:20:11 -02001173 if (force_author && renew_authorship)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001174 die(_("Using both --reset-author and --author does not make sense"));
Erick Mattosc51f6ce2009-11-04 01:20:11 -02001175
René Scharfe25206772013-05-25 23:43:34 +02001176 if (logfile || have_option_m || use_message || fixup_message)
Junio C Hamano48034662007-12-22 19:25:37 -08001177 use_editor = 0;
Junio C Hamanoca1ba202011-12-06 13:09:55 -08001178 if (0 <= edit_flag)
1179 use_editor = edit_flag;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001180
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001181 /* Sanity check options */
Junio C Hamano06bb6432011-08-19 11:58:18 -07001182 if (amend && !current_head)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001183 die(_("You have nothing to amend."));
Ævar Arnfjörð Bjarmasonb0cea472012-04-30 15:33:13 +00001184 if (amend && whence != FROM_COMMIT) {
1185 if (whence == FROM_MERGE)
1186 die(_("You are in the middle of a merge -- cannot amend."));
1187 else if (whence == FROM_CHERRY_PICK)
1188 die(_("You are in the middle of a cherry-pick -- cannot amend."));
1189 }
Pat Notz89ac1222010-11-02 13:59:11 -06001190 if (fixup_message && squash_message)
Ævar Arnfjörð Bjarmason9c227652011-02-22 23:41:45 +00001191 die(_("Options --squash and --fixup cannot be used together"));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001192 if (use_message)
1193 f++;
1194 if (edit_message)
1195 f++;
Pat Notzd71b8ba2010-11-02 13:59:09 -06001196 if (fixup_message)
1197 f++;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001198 if (logfile)
1199 f++;
1200 if (f > 1)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001201 die(_("Only one of -c/-C/-F/--fixup can be used."));
Ævar Arnfjörð Bjarmason30884c92017-12-22 20:41:52 +00001202 if (have_option_m && (edit_message || use_message || logfile))
1203 die((_("Option -m cannot be combined with -c/-C/-F.")));
Jeff King27014cb2016-04-07 12:56:26 -07001204 if (f || have_option_m)
Junio C Hamano010c7db2012-03-30 11:30:59 -07001205 template_file = NULL;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001206 if (edit_message)
1207 use_message = edit_message;
Pat Notzd71b8ba2010-11-02 13:59:09 -06001208 if (amend && !use_message && !fixup_message)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001209 use_message = "HEAD";
Jay Soffian37f7a852011-02-19 23:12:29 -05001210 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001211 die(_("--reset-author can be used only with -C, -c or --amend."));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001212 if (use_message) {
Jay Soffian37f7a852011-02-19 23:12:29 -05001213 use_message_buffer = read_commit_message(use_message);
1214 if (!renew_authorship) {
1215 author_message = use_message;
1216 author_message_buffer = use_message_buffer;
1217 }
1218 }
1219 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1220 author_message = "CHERRY_PICK_HEAD";
1221 author_message_buffer = read_commit_message(author_message);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001222 }
1223
Conrad Irwinb4bd4662011-05-07 10:58:07 -07001224 if (patch_interactive)
1225 interactive = 1;
1226
Stefan Beller05efb7b2013-08-07 09:32:25 +02001227 if (also + only + all + interactive > 1)
Conrad Irwinb4bd4662011-05-07 10:58:07 -07001228 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
Andreas Krey319d8352016-12-02 23:15:13 +01001229 if (argc == 0 && (also || (only && !amend && !allow_empty)))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001230 die(_("No paths with --include/--only does not make sense."));
Alex Riesen5f065732007-12-22 19:46:24 +01001231 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1232 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1233 else if (!strcmp(cleanup_arg, "verbatim"))
1234 cleanup_mode = CLEANUP_NONE;
1235 else if (!strcmp(cleanup_arg, "whitespace"))
1236 cleanup_mode = CLEANUP_SPACE;
1237 else if (!strcmp(cleanup_arg, "strip"))
1238 cleanup_mode = CLEANUP_ALL;
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +07001239 else if (!strcmp(cleanup_arg, "scissors"))
1240 cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
Alex Riesen5f065732007-12-22 19:46:24 +01001241 else
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001242 die(_("Invalid cleanup mode %s"), cleanup_arg);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001243
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001244 handle_untracked_files_arg(s);
Marius Storm-Olsen4bfee302008-06-05 10:31:19 +02001245
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001246 if (all && argc > 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001247 die(_("Paths with -a does not make sense."));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001248
Jeff Kingf3f47a12012-10-18 21:15:50 +07001249 if (status_format != STATUS_FORMAT_NONE)
Jeff King7c9f7032009-09-05 04:59:56 -04001250 dry_run = 1;
1251
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001252 return argc;
1253}
1254
Junio C Hamanod249b092009-08-09 21:59:30 -07001255static int dry_run_commit(int argc, const char **argv, const char *prefix,
Junio C Hamano06bb6432011-08-19 11:58:18 -07001256 const struct commit *current_head, struct wt_status *s)
Junio C Hamano3a5d13a2009-08-07 23:03:36 -07001257{
1258 int commitable;
1259 const char *index_file;
1260
Junio C Hamano06bb6432011-08-19 11:58:18 -07001261 index_file = prepare_index(argc, argv, prefix, current_head, 1);
Junio C Hamanod249b092009-08-09 21:59:30 -07001262 commitable = run_status(stdout, index_file, prefix, 0, s);
Junio C Hamano3a5d13a2009-08-07 23:03:36 -07001263 rollback_index_files();
1264
1265 return commitable ? 0 : 1;
1266}
1267
Jonathan Nieder88521172014-10-07 15:16:57 -04001268static int parse_status_slot(const char *slot)
Junio C Hamanof766b362009-08-09 23:12:19 -07001269{
Jonathan Nieder88521172014-10-07 15:16:57 -04001270 if (!strcasecmp(slot, "header"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001271 return WT_STATUS_HEADER;
Jonathan Nieder88521172014-10-07 15:16:57 -04001272 if (!strcasecmp(slot, "branch"))
Aleksi Aalto1d282322010-11-18 01:40:05 +02001273 return WT_STATUS_ONBRANCH;
Jonathan Nieder88521172014-10-07 15:16:57 -04001274 if (!strcasecmp(slot, "updated") || !strcasecmp(slot, "added"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001275 return WT_STATUS_UPDATED;
Jonathan Nieder88521172014-10-07 15:16:57 -04001276 if (!strcasecmp(slot, "changed"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001277 return WT_STATUS_CHANGED;
Jonathan Nieder88521172014-10-07 15:16:57 -04001278 if (!strcasecmp(slot, "untracked"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001279 return WT_STATUS_UNTRACKED;
Jonathan Nieder88521172014-10-07 15:16:57 -04001280 if (!strcasecmp(slot, "nobranch"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001281 return WT_STATUS_NOBRANCH;
Jonathan Nieder88521172014-10-07 15:16:57 -04001282 if (!strcasecmp(slot, "unmerged"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001283 return WT_STATUS_UNMERGED;
Stephen Kent93fdf302017-04-21 22:42:02 -07001284 if (!strcasecmp(slot, "localBranch"))
1285 return WT_STATUS_LOCAL_BRANCH;
1286 if (!strcasecmp(slot, "remoteBranch"))
1287 return WT_STATUS_REMOTE_BRANCH;
Jeff King8b8e8622009-12-12 07:25:24 -05001288 return -1;
Junio C Hamanof766b362009-08-09 23:12:19 -07001289}
1290
1291static int git_status_config(const char *k, const char *v, void *cb)
1292{
1293 struct wt_status *s = cb;
René Scharfee3f1da92014-10-04 20:54:50 +02001294 const char *slot_name;
Junio C Hamanof766b362009-08-09 23:12:19 -07001295
Christian Couder59556542013-11-30 21:55:40 +01001296 if (starts_with(k, "column."))
Jeff King4d2292e2012-05-07 15:35:03 -04001297 return git_column_config(k, v, "status", &s->colopts);
Junio C Hamanof766b362009-08-09 23:12:19 -07001298 if (!strcmp(k, "status.submodulesummary")) {
1299 int is_bool;
1300 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1301 if (is_bool && s->submodule_summary)
1302 s->submodule_summary = -1;
1303 return 0;
1304 }
Jorge Juan Garcia Garcia4fb51662013-06-11 15:34:04 +02001305 if (!strcmp(k, "status.short")) {
1306 if (git_config_bool(k, v))
Junio C Hamano84b42022013-06-24 11:41:40 -07001307 status_deferred_config.status_format = STATUS_FORMAT_SHORT;
Jorge Juan Garcia Garcia4fb51662013-06-11 15:34:04 +02001308 else
Junio C Hamano84b42022013-06-24 11:41:40 -07001309 status_deferred_config.status_format = STATUS_FORMAT_NONE;
Jorge Juan Garcia Garcia4fb51662013-06-11 15:34:04 +02001310 return 0;
1311 }
Jorge Juan Garcia Garciaec85d072013-06-11 15:34:05 +02001312 if (!strcmp(k, "status.branch")) {
Junio C Hamano84b42022013-06-24 11:41:40 -07001313 status_deferred_config.show_branch = git_config_bool(k, v);
Jorge Juan Garcia Garciaec85d072013-06-11 15:34:05 +02001314 return 0;
1315 }
Liam Beguinc1b5d012017-06-17 18:30:51 -04001316 if (!strcmp(k, "status.showstash")) {
1317 s->show_stash = git_config_bool(k, v);
1318 return 0;
1319 }
Junio C Hamanof766b362009-08-09 23:12:19 -07001320 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
Jeff Kinge269eb72011-08-17 22:03:48 -07001321 s->use_color = git_config_colorbool(k, v);
Junio C Hamanof766b362009-08-09 23:12:19 -07001322 return 0;
1323 }
Matthieu Moy2556b992013-09-06 19:43:07 +02001324 if (!strcmp(k, "status.displaycommentprefix")) {
1325 s->display_comment_prefix = git_config_bool(k, v);
1326 return 0;
1327 }
René Scharfee3f1da92014-10-04 20:54:50 +02001328 if (skip_prefix(k, "status.color.", &slot_name) ||
1329 skip_prefix(k, "color.status.", &slot_name)) {
Junio C Hamanob9465762014-10-20 12:23:48 -07001330 int slot = parse_status_slot(slot_name);
Jeff King8b8e8622009-12-12 07:25:24 -05001331 if (slot < 0)
1332 return 0;
Junio C Hamanof766b362009-08-09 23:12:19 -07001333 if (!v)
1334 return config_error_nonbool(k);
Jeff Kingf6c5a292014-10-07 15:33:09 -04001335 return color_parse(v, s->color_palette[slot]);
Junio C Hamanof766b362009-08-09 23:12:19 -07001336 }
1337 if (!strcmp(k, "status.relativepaths")) {
1338 s->relative_paths = git_config_bool(k, v);
1339 return 0;
1340 }
1341 if (!strcmp(k, "status.showuntrackedfiles")) {
1342 if (!v)
1343 return config_error_nonbool(k);
1344 else if (!strcmp(v, "no"))
1345 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1346 else if (!strcmp(v, "normal"))
1347 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1348 else if (!strcmp(v, "all"))
1349 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1350 else
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001351 return error(_("Invalid untracked files mode '%s'"), v);
Junio C Hamanof766b362009-08-09 23:12:19 -07001352 return 0;
1353 }
1354 return git_diff_ui_config(k, v, NULL);
1355}
1356
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001357int cmd_status(int argc, const char **argv, const char *prefix)
1358{
Jeff King036dbbf2012-05-07 15:18:26 -04001359 static struct wt_status s;
Markus Heidelberg4bb66442010-04-02 23:44:21 +02001360 int fd;
brian m. carlson8066df42017-02-20 00:10:14 +00001361 struct object_id oid;
Junio C Hamano9e4b7ab2009-08-15 02:27:39 -07001362 static struct option builtin_status_options[] = {
Nguyễn Thái Ngọc Duyf2276312012-08-20 19:32:37 +07001363 OPT__VERBOSE(&verbose, N_("be verbose")),
Jeff Kingdd2be242009-09-05 04:54:14 -04001364 OPT_SET_INT('s', "short", &status_format,
Nguyễn Thái Ngọc Duyf2276312012-08-20 19:32:37 +07001365 N_("show status concisely"), STATUS_FORMAT_SHORT),
Junio C Hamano84b42022013-06-24 11:41:40 -07001366 OPT_BOOL('b', "branch", &s.show_branch,
1367 N_("show branch information")),
Liam Beguinc1b5d012017-06-17 18:30:51 -04001368 OPT_BOOL(0, "show-stash", &s.show_stash,
1369 N_("show stash information")),
Jeff Hostetlerc4f596b2016-08-05 18:00:28 -04001370 { OPTION_CALLBACK, 0, "porcelain", &status_format,
1371 N_("version"), N_("machine-readable output"),
1372 PARSE_OPT_OPTARG, opt_parse_porcelain },
Jeff Kingf3f47a12012-10-18 21:15:50 +07001373 OPT_SET_INT(0, "long", &status_format,
1374 N_("show status in long format (default)"),
1375 STATUS_FORMAT_LONG),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001376 OPT_BOOL('z', "null", &s.null_termination,
1377 N_("terminate entries with NUL")),
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001378 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
Nguyễn Thái Ngọc Duyf2276312012-08-20 19:32:37 +07001379 N_("mode"),
1380 N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001381 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
Jameson Millereec0f7f2017-10-30 13:21:37 -04001382 { OPTION_STRING, 0, "ignored", &ignored_arg,
1383 N_("mode"),
1384 N_("show ignored files, optional modes: traditional, matching, no. (Default: traditional)"),
1385 PARSE_OPT_OPTARG, NULL, (intptr_t)"traditional" },
Nguyễn Thái Ngọc Duyf2276312012-08-20 19:32:37 +07001386 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
1387 N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
Jens Lehmann46a958b2010-06-25 16:56:47 +02001388 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001389 OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001390 OPT_END(),
1391 };
1392
Nguyễn Thái Ngọc Duy5d3dd912010-10-22 01:45:47 -05001393 if (argc == 2 && !strcmp(argv[1], "-h"))
1394 usage_with_options(builtin_status_usage, builtin_status_options);
1395
Matthieu Moy5c25dfa2013-09-12 12:50:04 +02001396 status_init_config(&s, git_status_config);
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001397 argc = parse_options(argc, argv, prefix,
Junio C Hamano9e4b7ab2009-08-15 02:27:39 -07001398 builtin_status_options,
1399 builtin_status_usage, 0);
Jeff King4d2292e2012-05-07 15:35:03 -04001400 finalize_colopts(&s.colopts, -1);
Junio C Hamano84b42022013-06-24 11:41:40 -07001401 finalize_deferred_config(&s);
Junio C Hamano6c929722011-06-06 11:40:08 -07001402
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001403 handle_untracked_files_arg(&s);
Jameson Millereec0f7f2017-10-30 13:21:37 -04001404 handle_ignored_arg(&s);
1405
1406 if (s.show_ignored_mode == SHOW_MATCHING_IGNORED &&
1407 s.show_untracked_files == SHOW_NO_UNTRACKED_FILES)
1408 die(_("Unsupported combination of ignored and untracked-files arguments"));
1409
Nguyễn Thái Ngọc Duy15b55ae2013-07-14 15:35:39 +07001410 parse_pathspec(&s.pathspec, 0,
1411 PATHSPEC_PREFER_FULL,
1412 prefix, argv);
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001413
Nguyễn Thái Ngọc Duy5ab2a2d2013-07-14 15:35:49 +07001414 read_cache_preload(&s.pathspec);
Nguyễn Thái Ngọc Duy9b2d6142013-07-14 15:35:54 +07001415 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
Markus Heidelberg4bb66442010-04-02 23:44:21 +02001416
Jeff King27344d62017-09-27 02:54:30 -04001417 if (use_optional_locks())
1418 fd = hold_locked_index(&index_lock, 0);
1419 else
1420 fd = -1;
Markus Heidelberg4bb66442010-04-02 23:44:21 +02001421
brian m. carlsone82caf32017-07-13 23:49:28 +00001422 s.is_initial = get_oid(s.reference, &oid) ? 1 : 0;
Jeff Hostetlerd9fc7462016-08-11 10:45:59 -04001423 if (!s.is_initial)
brian m. carlson8066df42017-02-20 00:10:14 +00001424 hashcpy(s.sha1_commit, oid.hash);
Jeff Hostetlerd9fc7462016-08-11 10:45:59 -04001425
Jens Lehmann46a958b2010-06-25 16:56:47 +02001426 s.ignore_submodule_arg = ignore_submodule_arg;
Jeff Hostetlerbe7e7952016-08-05 18:00:27 -04001427 s.status_format = status_format;
1428 s.verbose = verbose;
1429
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001430 wt_status_collect(&s);
1431
Nguyễn Thái Ngọc Duy226c0512015-03-08 17:12:41 +07001432 if (0 <= fd)
1433 update_index_if_able(&the_index, &index_lock);
1434
Jeff King86617682009-12-07 00:26:25 -05001435 if (s.relative_paths)
1436 s.prefix = prefix;
Markus Heidelberg38920dd2009-01-08 19:53:05 +01001437
Jeff Hostetlerbe7e7952016-08-05 18:00:27 -04001438 wt_status_print(&s);
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001439 return 0;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001440}
1441
Matthieu Moy8b27ff72014-07-25 21:11:36 +02001442static const char *implicit_ident_advice(void)
1443{
Nguyễn Thái Ngọc Duy4aad2f12017-04-05 17:24:38 +07001444 char *user_config = expand_user_path("~/.gitconfig", 0);
Paul Tane682c9d2015-05-06 16:01:02 +08001445 char *xdg_config = xdg_config_home("config");
1446 int config_exists = file_exists(user_config) || file_exists(xdg_config);
Matthieu Moy8b27ff72014-07-25 21:11:36 +02001447
Matthieu Moy8b27ff72014-07-25 21:11:36 +02001448 free(user_config);
1449 free(xdg_config);
1450
1451 if (config_exists)
1452 return _(implicit_ident_advice_config);
1453 else
1454 return _(implicit_ident_advice_noconfig);
1455
1456}
1457
brian m. carlson8066df42017-02-20 00:10:14 +00001458static void print_summary(const char *prefix, const struct object_id *oid,
Junio C Hamano06bb6432011-08-19 11:58:18 -07001459 int initial_commit)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001460{
1461 struct rev_info rev;
1462 struct commit *commit;
Jeff King49ff9a72010-01-13 12:39:51 -05001463 struct strbuf format = STRBUF_INIT;
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001464 const char *head;
Jeff King49ff9a72010-01-13 12:39:51 -05001465 struct pretty_print_context pctx = {0};
1466 struct strbuf author_ident = STRBUF_INIT;
1467 struct strbuf committer_ident = STRBUF_INIT;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001468
brian m. carlsonbc832662017-05-06 22:10:10 +00001469 commit = lookup_commit(oid);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001470 if (!commit)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001471 die(_("couldn't look up newly created commit"));
Jeff King5e7d4d32013-10-24 04:53:19 -04001472 if (parse_commit(commit))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001473 die(_("could not parse newly created commit"));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001474
Jeff King49ff9a72010-01-13 12:39:51 -05001475 strbuf_addstr(&format, "format:%h] %s");
1476
1477 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1478 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1479 if (strbuf_cmp(&author_ident, &committer_ident)) {
1480 strbuf_addstr(&format, "\n Author: ");
1481 strbuf_addbuf_percentquote(&format, &author_ident);
1482 }
Jeff Kingb7242b82014-05-01 21:10:01 -04001483 if (author_date_is_interesting()) {
1484 struct strbuf date = STRBUF_INIT;
1485 format_commit_message(commit, "%ad", &date, &pctx);
1486 strbuf_addstr(&format, "\n Date: ");
1487 strbuf_addbuf_percentquote(&format, &date);
1488 strbuf_release(&date);
1489 }
Jeff Kingd6991ce2012-11-14 16:34:13 -08001490 if (!committer_ident_sufficiently_given()) {
Jeff King49ff9a72010-01-13 12:39:51 -05001491 strbuf_addstr(&format, "\n Committer: ");
1492 strbuf_addbuf_percentquote(&format, &committer_ident);
Jeff Kingb706fcf2010-01-13 15:17:08 -05001493 if (advice_implicit_identity) {
1494 strbuf_addch(&format, '\n');
Matthieu Moy8b27ff72014-07-25 21:11:36 +02001495 strbuf_addstr(&format, implicit_ident_advice());
Jeff Kingb706fcf2010-01-13 15:17:08 -05001496 }
Jeff King49ff9a72010-01-13 12:39:51 -05001497 }
1498 strbuf_release(&author_ident);
1499 strbuf_release(&committer_ident);
1500
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001501 init_revisions(&rev, prefix);
1502 setup_revisions(0, NULL, &rev, NULL);
1503
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001504 rev.diff = 1;
1505 rev.diffopt.output_format =
1506 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1507
1508 rev.verbose_header = 1;
1509 rev.show_root_diff = 1;
Jeff King49ff9a72010-01-13 12:39:51 -05001510 get_commit_format(format.buf, &rev);
Junio C Hamanobf82a152007-12-10 21:02:26 -08001511 rev.always_show_header = 0;
Junio C Hamano3eb2a152007-12-16 15:05:39 -08001512 rev.diffopt.detect_rename = 1;
Junio C Hamano3eb2a152007-12-16 15:05:39 -08001513 rev.diffopt.break_opt = 0;
Junio C Hamano15964562007-12-16 15:03:58 -08001514 diff_setup_done(&rev.diffopt);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001515
René Scharfe744c0402017-09-23 11:45:04 +02001516 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
Andrey Okoshkinc26de082017-10-20 14:03:28 +03001517 if (!head)
1518 die_errno(_("unable to resolve HEAD after creating commit"));
René Scharfee3f1da92014-10-04 20:54:50 +02001519 if (!strcmp(head, "HEAD"))
1520 head = _("detached HEAD");
1521 else
1522 skip_prefix(head, "refs/heads/", &head);
1523 printf("[%s%s ", head, initial_commit ? _(" (root-commit)") : "");
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001524
Junio C Hamanobf82a152007-12-10 21:02:26 -08001525 if (!log_tree_commit(&rev, commit)) {
Tay Ray Chuana45e1a82010-06-12 22:15:39 +08001526 rev.always_show_header = 1;
1527 rev.use_terminator = 1;
1528 log_tree_commit(&rev, commit);
Junio C Hamanobf82a152007-12-10 21:02:26 -08001529 }
Tay Ray Chuana45e1a82010-06-12 22:15:39 +08001530
Junio C Hamanofc6f19f2010-01-17 00:57:51 -08001531 strbuf_release(&format);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001532}
1533
Stephan Beyer186458b2008-07-24 01:09:35 +02001534static int git_commit_config(const char *k, const char *v, void *cb)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001535{
Junio C Hamanod249b092009-08-09 21:59:30 -07001536 struct wt_status *s = cb;
Junio C Hamanoba3c69a2011-10-05 17:23:20 -07001537 int status;
Junio C Hamanod249b092009-08-09 21:59:30 -07001538
Brian Hetro984c6e72008-07-05 01:24:40 -04001539 if (!strcmp(k, "commit.template"))
Matthieu Moy395de252009-11-17 18:24:25 +01001540 return git_config_pathname(&template_file, k, v);
James P. Howard, IIbed575e2009-12-07 17:45:27 -05001541 if (!strcmp(k, "commit.status")) {
1542 include_status = git_config_bool(k, v);
1543 return 0;
1544 }
Ralf Thielow51fb3a32013-01-10 18:45:59 +01001545 if (!strcmp(k, "commit.cleanup"))
1546 return git_config_string(&cleanup_arg, k, v);
Nicolas Vigierd95bfb12013-11-05 00:14:41 +01001547 if (!strcmp(k, "commit.gpgsign")) {
1548 sign_commit = git_config_bool(k, v) ? "" : NULL;
1549 return 0;
1550 }
Pranit Bauvaaaab8422016-05-05 15:20:02 +05301551 if (!strcmp(k, "commit.verbose")) {
1552 int is_bool;
1553 config_commit_verbose = git_config_bool_or_int(k, v, &is_bool);
1554 return 0;
1555 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001556
Junio C Hamanoba3c69a2011-10-05 17:23:20 -07001557 status = git_gpg_config(k, v, NULL);
1558 if (status)
1559 return status;
Junio C Hamanod249b092009-08-09 21:59:30 -07001560 return git_status_config(k, v, s);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001561}
1562
brian m. carlson8066df42017-02-20 00:10:14 +00001563static int run_rewrite_hook(const struct object_id *oldoid,
1564 const struct object_id *newoid)
Thomas Rast6f6bee32010-03-12 18:04:28 +01001565{
René Scharfed3180272014-08-19 21:09:35 +02001566 struct child_process proc = CHILD_PROCESS_INIT;
Thomas Rast6f6bee32010-03-12 18:04:28 +01001567 const char *argv[3];
1568 int code;
Elia Pinto4a528192017-01-31 13:45:35 +00001569 struct strbuf sb = STRBUF_INIT;
Thomas Rast6f6bee32010-03-12 18:04:28 +01001570
Aaron Schrab5a7da2d2013-01-13 00:17:02 -05001571 argv[0] = find_hook("post-rewrite");
1572 if (!argv[0])
Thomas Rast6f6bee32010-03-12 18:04:28 +01001573 return 0;
1574
Thomas Rast6f6bee32010-03-12 18:04:28 +01001575 argv[1] = "amend";
1576 argv[2] = NULL;
1577
Thomas Rast6f6bee32010-03-12 18:04:28 +01001578 proc.argv = argv;
1579 proc.in = -1;
1580 proc.stdout_to_stderr = 1;
1581
1582 code = start_command(&proc);
1583 if (code)
1584 return code;
brian m. carlson8066df42017-02-20 00:10:14 +00001585 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
Clemens Buchacheraf65f682015-11-16 09:05:58 +01001586 sigchain_push(SIGPIPE, SIG_IGN);
Elia Pinto4a528192017-01-31 13:45:35 +00001587 write_in_full(proc.in, sb.buf, sb.len);
Thomas Rast6f6bee32010-03-12 18:04:28 +01001588 close(proc.in);
Elia Pinto4a528192017-01-31 13:45:35 +00001589 strbuf_release(&sb);
Clemens Buchacheraf65f682015-11-16 09:05:58 +01001590 sigchain_pop(SIGPIPE);
Thomas Rast6f6bee32010-03-12 18:04:28 +01001591 return finish_command(&proc);
1592}
1593
Benoit Pierre15048f82014-03-18 11:00:53 +01001594int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
1595{
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001596 struct argv_array hook_env = ARGV_ARRAY_INIT;
Benoit Pierre15048f82014-03-18 11:00:53 +01001597 va_list args;
1598 int ret;
1599
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001600 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", index_file);
Benoit Pierre15048f82014-03-18 11:00:53 +01001601
1602 /*
1603 * Let the hook know that no editor will be launched.
1604 */
1605 if (!editor_is_used)
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001606 argv_array_push(&hook_env, "GIT_EDITOR=:");
Benoit Pierre15048f82014-03-18 11:00:53 +01001607
1608 va_start(args, name);
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001609 ret = run_hook_ve(hook_env.argv,name, args);
Benoit Pierre15048f82014-03-18 11:00:53 +01001610 va_end(args);
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001611 argv_array_clear(&hook_env);
Benoit Pierre15048f82014-03-18 11:00:53 +01001612
1613 return ret;
1614}
1615
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001616int cmd_commit(int argc, const char **argv, const char *prefix)
1617{
Jeff King036dbbf2012-05-07 15:18:26 -04001618 static struct wt_status s;
1619 static struct option builtin_commit_options[] = {
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001620 OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
1621 OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
Jeff King036dbbf2012-05-07 15:18:26 -04001622
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001623 OPT_GROUP(N_("Commit message options")),
1624 OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
1625 OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
1626 OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
1627 OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
1628 OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
1629 OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
1630 OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
1631 OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001632 OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
1633 OPT_BOOL('s', "signoff", &signoff, N_("add Signed-off-by:")),
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001634 OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
1635 OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
1636 OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001637 OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
Junio C Hamanoe703d712014-03-23 15:58:12 -07001638 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001639 N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
Jeff King036dbbf2012-05-07 15:18:26 -04001640 /* end commit message options */
1641
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001642 OPT_GROUP(N_("Commit contents options")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001643 OPT_BOOL('a', "all", &all, N_("commit all changed files")),
1644 OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")),
1645 OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
1646 OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
1647 OPT_BOOL('o', "only", &only, N_("commit only specified files")),
Orgad Shanehdef480f2016-07-26 17:00:15 +03001648 OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit and commit-msg hooks")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001649 OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001650 OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
Jeff King036dbbf2012-05-07 15:18:26 -04001651 STATUS_FORMAT_SHORT),
Junio C Hamano84b42022013-06-24 11:41:40 -07001652 OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
Jeff King036dbbf2012-05-07 15:18:26 -04001653 OPT_SET_INT(0, "porcelain", &status_format,
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001654 N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
Jeff Kingf3f47a12012-10-18 21:15:50 +07001655 OPT_SET_INT(0, "long", &status_format,
1656 N_("show status in long format (default)"),
1657 STATUS_FORMAT_LONG),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001658 OPT_BOOL('z', "null", &s.null_termination,
1659 N_("terminate entries with NUL")),
1660 OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
1661 OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001662 { 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" },
Jeff King036dbbf2012-05-07 15:18:26 -04001663 /* end commit contents options */
1664
Stefan Beller4741edd2013-08-03 13:51:18 +02001665 OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
1666 N_("ok to record an empty change")),
1667 OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message,
1668 N_("ok to record a change with an empty message")),
Jeff King036dbbf2012-05-07 15:18:26 -04001669
1670 OPT_END()
1671 };
1672
Brandon Caseyf285a2d2008-10-09 14:12:12 -05001673 struct strbuf sb = STRBUF_INIT;
Junio C Hamano4c28e4a2010-12-20 17:00:36 -08001674 struct strbuf author_ident = STRBUF_INIT;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001675 const char *index_file, *reflog_msg;
Jens Lehmann1a72cfd2013-12-05 20:44:14 +01001676 char *nl;
brian m. carlson8066df42017-02-20 00:10:14 +00001677 struct object_id oid;
René Scharfede9f7fa2016-10-29 14:55:36 +02001678 struct commit_list *parents = NULL;
Miklos Vajnacf10f9f2008-10-03 14:04:47 +02001679 struct stat statbuf;
Junio C Hamano06bb6432011-08-19 11:58:18 -07001680 struct commit *current_head = NULL;
Junio C Hamanoed7a42a2011-11-08 15:38:07 -08001681 struct commit_extra_header *extra = NULL;
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001682 struct ref_transaction *transaction;
1683 struct strbuf err = STRBUF_INIT;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001684
Nguyễn Thái Ngọc Duy5d3dd912010-10-22 01:45:47 -05001685 if (argc == 2 && !strcmp(argv[1], "-h"))
1686 usage_with_options(builtin_commit_usage, builtin_commit_options);
1687
Matthieu Moy5c25dfa2013-09-12 12:50:04 +02001688 status_init_config(&s, git_commit_config);
Kaartic Sivaraam4ddb1352017-06-21 23:46:14 +05301689 s.commit_template = 1;
Ramkumar Ramachandraf0915cb2013-06-24 18:15:12 +05301690 status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
Jeff King4d2292e2012-05-07 15:35:03 -04001691 s.colopts = 0;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001692
brian m. carlsone82caf32017-07-13 23:49:28 +00001693 if (get_oid("HEAD", &oid))
Junio C Hamano06bb6432011-08-19 11:58:18 -07001694 current_head = NULL;
1695 else {
brian m. carlsonbc832662017-05-06 22:10:10 +00001696 current_head = lookup_commit_or_die(&oid, "HEAD");
Jeff King5e7d4d32013-10-24 04:53:19 -04001697 if (parse_commit(current_head))
Junio C Hamano06bb6432011-08-19 11:58:18 -07001698 die(_("could not parse HEAD commit"));
1699 }
Pranit Bauvaaaab8422016-05-05 15:20:02 +05301700 verbose = -1; /* unspecified */
Jeff King036dbbf2012-05-07 15:18:26 -04001701 argc = parse_and_validate_options(argc, argv, builtin_commit_options,
1702 builtin_commit_usage,
Junio C Hamano06bb6432011-08-19 11:58:18 -07001703 prefix, current_head, &s);
Pranit Bauvaaaab8422016-05-05 15:20:02 +05301704 if (verbose == -1)
1705 verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose;
1706
Jeff Kingc9bfb952011-08-17 22:05:35 -07001707 if (dry_run)
Junio C Hamano06bb6432011-08-19 11:58:18 -07001708 return dry_run_commit(argc, argv, prefix, current_head, &s);
Junio C Hamano06bb6432011-08-19 11:58:18 -07001709 index_file = prepare_index(argc, argv, prefix, current_head, 0);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001710
Paolo Bonziniec84bd02008-02-05 11:01:46 +01001711 /* Set up everything for writing the commit object. This includes
1712 running hooks, writing the trees, and interacting with the user. */
Junio C Hamano06bb6432011-08-19 11:58:18 -07001713 if (!prepare_to_commit(index_file, prefix,
1714 current_head, &s, &author_ident)) {
Junio C Hamano28886052007-11-18 01:52:55 -08001715 rollback_index_files();
1716 return 1;
1717 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001718
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001719 /* Determine parents */
Christian Couder643cb5f2010-06-12 18:05:12 +02001720 reflog_msg = getenv("GIT_REFLOG_ACTION");
Junio C Hamano06bb6432011-08-19 11:58:18 -07001721 if (!current_head) {
Christian Couder643cb5f2010-06-12 18:05:12 +02001722 if (!reflog_msg)
1723 reflog_msg = "commit (initial)";
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001724 } else if (amend) {
Christian Couder643cb5f2010-06-12 18:05:12 +02001725 if (!reflog_msg)
1726 reflog_msg = "commit (amend)";
René Scharfede9f7fa2016-10-29 14:55:36 +02001727 parents = copy_commit_list(current_head->parents);
Jay Soffian37f7a852011-02-19 23:12:29 -05001728 } else if (whence == FROM_MERGE) {
Brandon Caseyf285a2d2008-10-09 14:12:12 -05001729 struct strbuf m = STRBUF_INIT;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001730 FILE *fp;
Elia Pintoe23fd152014-01-30 07:15:56 -08001731 int allow_fast_forward = 1;
René Scharfede9f7fa2016-10-29 14:55:36 +02001732 struct commit_list **pptr = &parents;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001733
Christian Couder643cb5f2010-06-12 18:05:12 +02001734 if (!reflog_msg)
1735 reflog_msg = "commit (merge)";
René Scharfede9f7fa2016-10-29 14:55:36 +02001736 pptr = commit_list_append(current_head, pptr);
Nguyễn Thái Ngọc Duy23a9e072017-05-03 17:16:46 +07001737 fp = xfopen(git_path_merge_head(), "r");
Junio C Hamano8f309ae2016-01-13 15:31:17 -08001738 while (strbuf_getline_lf(&m, fp) != EOF) {
Junio C Hamano5231c632011-11-07 16:21:32 -08001739 struct commit *parent;
1740
1741 parent = get_merge_parent(m.buf);
1742 if (!parent)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001743 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
René Scharfede9f7fa2016-10-29 14:55:36 +02001744 pptr = commit_list_append(parent, pptr);
Linus Torvalds7c3fd252008-01-15 16:12:33 -08001745 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001746 fclose(fp);
1747 strbuf_release(&m);
Jeff Kingf9327292015-08-10 05:38:57 -04001748 if (!stat(git_path_merge_mode(), &statbuf)) {
1749 if (strbuf_read_file(&sb, git_path_merge_mode(), 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001750 die_errno(_("could not read MERGE_MODE"));
Miklos Vajnacf10f9f2008-10-03 14:04:47 +02001751 if (!strcmp(sb.buf, "no-ff"))
1752 allow_fast_forward = 0;
1753 }
1754 if (allow_fast_forward)
Martin Ågren4da72642017-11-07 21:39:45 +01001755 reduce_heads_replace(&parents);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001756 } else {
Christian Couder643cb5f2010-06-12 18:05:12 +02001757 if (!reflog_msg)
Jay Soffian37f7a852011-02-19 23:12:29 -05001758 reflog_msg = (whence == FROM_CHERRY_PICK)
1759 ? "commit (cherry-pick)"
1760 : "commit";
René Scharfede9f7fa2016-10-29 14:55:36 +02001761 commit_list_insert(current_head, &parents);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001762 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001763
Paolo Bonziniec84bd02008-02-05 11:01:46 +01001764 /* Finally, get the commit message */
Miklos Vajnacf10f9f2008-10-03 14:04:47 +02001765 strbuf_reset(&sb);
Pranit Bauvae51b0df2016-05-25 00:49:50 +05301766 if (strbuf_read_file(&sb, git_path_commit_editmsg(), 0) < 0) {
Thomas Rast0721c312009-06-27 17:58:47 +02001767 int saved_errno = errno;
Junio C Hamano740001a2007-12-08 23:23:20 -08001768 rollback_index_files();
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001769 die(_("could not read commit message: %s"), strerror(saved_errno));
Junio C Hamano740001a2007-12-08 23:23:20 -08001770 }
Kristian Høgsberg99a12692007-11-21 21:54:49 -05001771
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +07001772 if (verbose || /* Truncate the message just before the diff, if any. */
1773 cleanup_mode == CLEANUP_SCISSORS)
Brian Malehornd76650b2017-05-15 23:06:49 -07001774 strbuf_setlen(&sb, wt_status_locate_end(sb.buf, sb.len));
Alex Riesen5f065732007-12-22 19:46:24 +01001775 if (cleanup_mode != CLEANUP_NONE)
Tobias Klauser63af4a82015-10-16 17:16:42 +02001776 strbuf_stripspace(&sb, cleanup_mode == CLEANUP_ALL);
Kaartic Sivaraambc17f352017-07-17 21:06:15 +05301777
Ævar Arnfjörð Bjarmasonc9b5fde2010-04-06 08:40:35 +00001778 if (message_is_empty(&sb) && !allow_empty_message) {
Junio C Hamano28886052007-11-18 01:52:55 -08001779 rollback_index_files();
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001780 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
Jeff Kingfdc7c812008-07-31 03:36:09 -04001781 exit(1);
Junio C Hamano28886052007-11-18 01:52:55 -08001782 }
Kaartic Sivaraambc17f352017-07-17 21:06:15 +05301783 if (template_untouched(&sb) && !allow_empty_message) {
1784 rollback_index_files();
1785 fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
1786 exit(1);
1787 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001788
Junio C Hamano0074d182011-12-20 13:20:56 -08001789 if (amend) {
Junio C Hamanoc871a1d2012-01-05 10:54:14 -08001790 const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1791 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
Junio C Hamano0074d182011-12-20 13:20:56 -08001792 } else {
1793 struct commit_extra_header **tail = &extra;
1794 append_merge_tag_headers(parents, &tail);
1795 }
Junio C Hamanoed7a42a2011-11-08 15:38:07 -08001796
brian m. carlsone0a92802017-05-01 02:28:56 +00001797 if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->oid.hash,
brian m. carlson8066df42017-02-20 00:10:14 +00001798 parents, oid.hash, author_ident.buf, sign_commit, extra)) {
Junio C Hamano28886052007-11-18 01:52:55 -08001799 rollback_index_files();
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001800 die(_("failed to write commit object"));
Junio C Hamano28886052007-11-18 01:52:55 -08001801 }
Junio C Hamano4c28e4a2010-12-20 17:00:36 -08001802 strbuf_release(&author_ident);
Junio C Hamanoed7a42a2011-11-08 15:38:07 -08001803 free_commit_extra_headers(extra);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001804
Miklos Vajna6bb6b032008-09-10 22:10:32 +02001805 nl = strchr(sb.buf, '\n');
Johannes Schindelin741707b2007-11-08 12:15:26 +00001806 if (nl)
1807 strbuf_setlen(&sb, nl + 1 - sb.buf);
1808 else
1809 strbuf_addch(&sb, '\n');
Johannes Schindelin741707b2007-11-08 12:15:26 +00001810 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1811 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001812
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001813 transaction = ref_transaction_begin(&err);
1814 if (!transaction ||
brian m. carlson89f3bbd2017-10-15 22:06:53 +00001815 ref_transaction_update(transaction, "HEAD", &oid,
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001816 current_head
brian m. carlson89f3bbd2017-10-15 22:06:53 +00001817 ? &current_head->object.oid : &null_oid,
Michael Haggerty1d147bd2015-02-17 18:00:15 +01001818 0, sb.buf, &err) ||
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -07001819 ref_transaction_commit(transaction, &err)) {
Junio C Hamano28886052007-11-18 01:52:55 -08001820 rollback_index_files();
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001821 die("%s", err.buf);
Junio C Hamano28886052007-11-18 01:52:55 -08001822 }
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001823 ref_transaction_free(transaction);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001824
Jeff Kingf9327292015-08-10 05:38:57 -04001825 unlink(git_path_cherry_pick_head());
1826 unlink(git_path_revert_head());
1827 unlink(git_path_merge_head());
1828 unlink(git_path_merge_msg());
1829 unlink(git_path_merge_mode());
1830 unlink(git_path_squash_msg());
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001831
Brandon Casey5a9dd392008-01-23 11:21:22 -06001832 if (commit_index_files())
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001833 die (_("Repository has been updated, but unable to write\n"
Alex Henriead5fe372014-08-30 13:56:01 -06001834 "new_index file. Check that disk is not full and quota is\n"
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001835 "not exceeded, and then \"git reset HEAD\" to recover."));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001836
Junio C Hamanocb6020b2009-12-04 00:20:48 -08001837 rerere(0);
Benoit Pierre15048f82014-03-18 11:00:53 +01001838 run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
Thomas Rast6f6bee32010-03-12 18:04:28 +01001839 if (amend && !no_post_rewrite) {
Thomas Rast6360d342010-03-12 18:04:34 +01001840 struct notes_rewrite_cfg *cfg;
1841 cfg = init_copy_notes_for_rewrite("amend");
1842 if (cfg) {
Junio C Hamano06bb6432011-08-19 11:58:18 -07001843 /* we are amending, so current_head is not NULL */
brian m. carlsonbb7e4732017-05-30 10:30:42 -07001844 copy_note_for_rewrite(cfg, &current_head->object.oid, &oid);
Johan Herland80a14662013-06-12 02:12:59 +02001845 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
Thomas Rast6360d342010-03-12 18:04:34 +01001846 }
brian m. carlson8066df42017-02-20 00:10:14 +00001847 run_rewrite_hook(&current_head->object.oid, &oid);
Thomas Rast6f6bee32010-03-12 18:04:28 +01001848 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001849 if (!quiet)
brian m. carlson8066df42017-02-20 00:10:14 +00001850 print_summary(prefix, &oid, !current_head);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001851
Jeff King0e5bba52017-09-08 02:38:41 -04001852 UNLEAK(err);
1853 UNLEAK(sb);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001854 return 0;
1855}