blob: be370f64a995804ec6b62e03f7c6940044e08e24 [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;
Jens Lehmann46a958b2010-06-25 16:56:47 +0200121static char *untracked_files_arg, *force_date, *ignore_submodule_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;
René Scharfe25206772013-05-25 23:43:34 +0200142static int show_ignored_in_status, 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
Nguyễn Thái Ngọc Duy03b86642014-06-13 19:19:23 +0700358 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
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"));
Junio C Hamano3fd13cb2014-09-11 10:33:32 -0700377 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
378 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);
Nguyễn Thái Ngọc Duy03b86642014-06-13 19:19:23 +0700404 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
Æ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);
Nguyễn Thái Ngọc Duy03b86642014-06-13 19:19:23 +0700477 if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
Æ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
Nguyễn Thái Ngọc Duy03b86642014-06-13 19:19:23 +0700489 if (write_locked_index(&the_index, &false_lock, CLOSE_LOCK))
Æ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
Jeff King27014cb2016-04-07 12:56:26 -0700704 if (have_option_m) {
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);
734 hook_arg1 = "message";
Jeff Kingf9327292015-08-10 05:38:57 -0400735 } else if (!stat(git_path_merge_msg(), &statbuf)) {
Sven Strickrothb64c1e02016-03-21 23:29:40 +0100736 /*
737 * prepend SQUASH_MSG here if it exists and a
738 * "merge --squash" was originally performed
739 */
740 if (!stat(git_path_squash_msg(), &statbuf)) {
741 if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
742 die_errno(_("could not read SQUASH_MSG"));
743 hook_arg1 = "squash";
744 } else
745 hook_arg1 = "merge";
Jeff Kingf9327292015-08-10 05:38:57 -0400746 if (strbuf_read_file(&sb, git_path_merge_msg(), 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000747 die_errno(_("could not read MERGE_MSG"));
Jeff Kingf9327292015-08-10 05:38:57 -0400748 } else if (!stat(git_path_squash_msg(), &statbuf)) {
749 if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000750 die_errno(_("could not read SQUASH_MSG"));
Paolo Bonzini8089c852008-02-05 08:04:18 +0100751 hook_arg1 = "squash";
Jonathan Nieder2140b142011-02-25 03:07:57 -0600752 } else if (template_file) {
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500753 if (strbuf_read_file(&sb, template_file, 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000754 die_errno(_("could not read '%s'"), template_file);
Paolo Bonzini8089c852008-02-05 08:04:18 +0100755 hook_arg1 = "template";
Boris Faure8b1ae672011-05-08 12:31:02 +0200756 clean_message_contents = 0;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500757 }
758
Paolo Bonzini8089c852008-02-05 08:04:18 +0100759 /*
Jay Soffian37f7a852011-02-19 23:12:29 -0500760 * The remaining cases don't modify the template message, but
761 * just set the argument(s) to the prepare-commit-msg hook.
Paolo Bonzini8089c852008-02-05 08:04:18 +0100762 */
Jay Soffian37f7a852011-02-19 23:12:29 -0500763 else if (whence == FROM_MERGE)
Paolo Bonzini8089c852008-02-05 08:04:18 +0100764 hook_arg1 = "merge";
Jay Soffian37f7a852011-02-19 23:12:29 -0500765 else if (whence == FROM_CHERRY_PICK) {
766 hook_arg1 = "commit";
767 hook_arg2 = "CHERRY_PICK_HEAD";
768 }
Paolo Bonzini8089c852008-02-05 08:04:18 +0100769
Pat Notz89ac1222010-11-02 13:59:11 -0600770 if (squash_message) {
771 /*
772 * If squash_commit was used for the commit subject,
773 * then we're possibly hijacking other commit log options.
774 * Reset the hook args to tell the real story.
775 */
776 hook_arg1 = "message";
777 hook_arg2 = "";
778 }
779
Pranit Bauvae51b0df2016-05-25 00:49:50 +0530780 s->fp = fopen_for_writing(git_path_commit_editmsg());
Jonathan Nieder37f30122011-02-25 23:10:49 -0600781 if (s->fp == NULL)
Pranit Bauvae51b0df2016-05-25 00:49:50 +0530782 die_errno(_("could not open '%s'"), git_path_commit_editmsg());
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500783
Matthieu Moy2556b992013-09-06 19:43:07 +0200784 /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
785 old_display_comment_prefix = s->display_comment_prefix;
786 s->display_comment_prefix = 1;
787
Matthieu Moyea9882b2013-09-12 12:50:06 +0200788 /*
789 * Most hints are counter-productive when the commit has
790 * already started.
791 */
792 s->hints = 0;
793
Boris Faure8b1ae672011-05-08 12:31:02 +0200794 if (clean_message_contents)
Tobias Klauser63af4a82015-10-16 17:16:42 +0200795 strbuf_stripspace(&sb, 0);
Johannes Schindelin13208572007-11-11 17:35:58 +0000796
Junio C Hamano073bd752014-10-28 12:44:09 -0700797 if (signoff)
Jonathan Tan710714a2016-11-02 10:29:17 -0700798 append_signoff(&sb, ignore_non_trailer(sb.buf, sb.len), 0);
Johannes Schindelin13208572007-11-11 17:35:58 +0000799
Jonathan Nieder37f30122011-02-25 23:10:49 -0600800 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000801 die_errno(_("could not write commit template"));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500802
Nguyễn Thái Ngọc Duy84c9dc22014-05-17 08:52:23 +0700803 if (auto_comment_line_char)
804 adjust_comment_line_char(&sb);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500805 strbuf_release(&sb);
806
Santi Béjarbb1ae3f2008-05-04 18:04:51 +0200807 /* This checks if committer ident is explicitly given */
Jeff Kingf20f3872012-07-23 14:50:35 -0400808 strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
James P. Howard, IIbed575e2009-12-07 17:45:27 -0500809 if (use_editor && include_status) {
Elia Pintoe23fd152014-01-30 07:15:56 -0800810 int ident_shown = 0;
811 int saved_color_setting;
Jeff King47010262014-05-01 21:06:57 -0400812 struct ident_split ci, ai;
813
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +0700814 if (whence != FROM_COMMIT) {
815 if (cleanup_mode == CLEANUP_SCISSORS)
816 wt_status_add_cut_line(s->fp);
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600817 status_printf_ln(s, GIT_COLOR_NORMAL,
Ævar Arnfjörð Bjarmasonb0cea472012-04-30 15:33:13 +0000818 whence == FROM_MERGE
819 ? _("\n"
820 "It looks like you may be committing a merge.\n"
821 "If this is not correct, please remove the file\n"
822 " %s\n"
823 "and try again.\n")
824 : _("\n"
825 "It looks like you may be committing a cherry-pick.\n"
826 "If this is not correct, please remove the file\n"
827 " %s\n"
828 "and try again.\n"),
Jeff Kingca03e062017-04-20 17:08:54 -0400829 whence == FROM_MERGE ?
830 git_path_merge_head() :
831 git_path_cherry_pick_head());
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +0700832 }
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100833
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600834 fprintf(s->fp, "\n");
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100835 if (cleanup_mode == CLEANUP_ALL)
Ævar Arnfjörð Bjarmason4064e662012-04-30 15:33:14 +0000836 status_printf(s, GIT_COLOR_NORMAL,
837 _("Please enter the commit message for your changes."
Junio C Hamanoeff80a92013-01-16 20:18:48 +0100838 " Lines starting\nwith '%c' will be ignored, and an empty"
839 " message aborts the commit.\n"), comment_line_char);
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +0700840 else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
841 wt_status_add_cut_line(s->fp);
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100842 else /* CLEANUP_SPACE, that is. */
Ævar Arnfjörð Bjarmason4064e662012-04-30 15:33:14 +0000843 status_printf(s, GIT_COLOR_NORMAL,
844 _("Please enter the commit message for your changes."
Junio C Hamanoeff80a92013-01-16 20:18:48 +0100845 " Lines starting\n"
846 "with '%c' will be kept; you may remove them"
847 " yourself if you want to.\n"
848 "An empty message aborts the commit.\n"), comment_line_char);
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100849
Jeff Kingfac90832014-12-10 10:42:10 -0500850 /*
851 * These should never fail because they come from our own
852 * fmt_ident. They may fail the sane_ident test, but we know
853 * that the name and mail pointers will at least be valid,
854 * which is enough for our tests and printing here.
855 */
856 assert_split_ident(&ai, author_ident);
857 assert_split_ident(&ci, &committer_ident);
Jeff King47010262014-05-01 21:06:57 -0400858
859 if (ident_cmp(&ai, &ci))
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600860 status_printf_ln(s, GIT_COLOR_NORMAL,
Ævar Arnfjörð Bjarmasonfe8165c2011-02-22 23:41:46 +0000861 _("%s"
Jeff King47010262014-05-01 21:06:57 -0400862 "Author: %.*s <%.*s>"),
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600863 ident_shown++ ? "" : "\n",
Jeff King47010262014-05-01 21:06:57 -0400864 (int)(ai.name_end - ai.name_begin), ai.name_begin,
865 (int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
Santi Béjare83dbe82008-05-04 18:04:50 +0200866
Jeff Kingb7242b82014-05-01 21:10:01 -0400867 if (author_date_is_interesting())
868 status_printf_ln(s, GIT_COLOR_NORMAL,
869 _("%s"
870 "Date: %s"),
871 ident_shown++ ? "" : "\n",
Jeff Kinga5481a62015-06-25 12:55:02 -0400872 show_ident_date(&ai, DATE_MODE(NORMAL)));
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100873
Jeff Kingd6991ce2012-11-14 16:34:13 -0800874 if (!committer_ident_sufficiently_given())
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600875 status_printf_ln(s, GIT_COLOR_NORMAL,
Ævar Arnfjörð Bjarmasonfe8165c2011-02-22 23:41:46 +0000876 _("%s"
Jeff King47010262014-05-01 21:06:57 -0400877 "Committer: %.*s <%.*s>"),
Jonathan Niederb926c0d2011-02-25 23:11:37 -0600878 ident_shown++ ? "" : "\n",
Jeff King47010262014-05-01 21:06:57 -0400879 (int)(ci.name_end - ci.name_begin), ci.name_begin,
880 (int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
Santi Béjarbb1ae3f2008-05-04 18:04:51 +0200881
Kaartic Sivaraamb3cf1b72017-06-30 17:42:21 +0530882 status_printf_ln(s, GIT_COLOR_NORMAL, "%s", ""); /* Add new line for clarity */
Santi Béjarbb1ae3f2008-05-04 18:04:51 +0200883
Junio C Hamanod249b092009-08-09 21:59:30 -0700884 saved_color_setting = s->use_color;
885 s->use_color = 0;
Jonathan Nieder37f30122011-02-25 23:10:49 -0600886 commitable = run_status(s->fp, index_file, prefix, 1, s);
Junio C Hamanod249b092009-08-09 21:59:30 -0700887 s->use_color = saved_color_setting;
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100888 } else {
brian m. carlson8066df42017-02-20 00:10:14 +0000889 struct object_id oid;
Junio C Hamanofbcf1182007-12-19 19:23:03 -0800890 const char *parent = "HEAD";
Alex Riesen71686242007-11-28 22:13:08 +0100891
Alex Riesen71686242007-11-28 22:13:08 +0100892 if (!active_nr && read_cache() < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000893 die(_("Cannot read index"));
Alex Riesen71686242007-11-28 22:13:08 +0100894
Junio C Hamanofbcf1182007-12-19 19:23:03 -0800895 if (amend)
896 parent = "HEAD^1";
897
brian m. carlsone82caf32017-07-13 23:49:28 +0000898 if (get_oid(parent, &oid)) {
Nguyễn Thái Ngọc Duy2c49f7f2016-10-24 17:42:22 +0700899 int i, ita_nr = 0;
900
901 for (i = 0; i < active_nr; i++)
902 if (ce_intent_to_add(active_cache[i]))
903 ita_nr++;
904 commitable = active_nr - ita_nr > 0;
905 } else {
Jens Lehmannc215d3d2014-04-05 18:59:36 +0200906 /*
907 * Unless the user did explicitly request a submodule
908 * ignore mode by passing a command line option we do
909 * not ignore any changed submodule SHA-1s when
910 * comparing index and parent, no matter what is
911 * configured. Otherwise we won't commit any
912 * submodules which were manually staged, which would
913 * be really confusing.
914 */
915 int diff_flags = DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG;
916 if (ignore_submodule_arg &&
917 !strcmp(ignore_submodule_arg, "all"))
918 diff_flags |= DIFF_OPT_IGNORE_SUBMODULES;
Nguyễn Thái Ngọc Duy018ec3c2016-10-24 17:42:21 +0700919 commitable = index_differs_from(parent, diff_flags, 1);
Jens Lehmannc215d3d2014-04-05 18:59:36 +0200920 }
Alex Riesen71686242007-11-28 22:13:08 +0100921 }
Junio C Hamano4c28e4a2010-12-20 17:00:36 -0800922 strbuf_release(&committer_ident);
Alex Riesen71686242007-11-28 22:13:08 +0100923
Jonathan Nieder37f30122011-02-25 23:10:49 -0600924 fclose(s->fp);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500925
Jay Soffian37f7a852011-02-19 23:12:29 -0500926 /*
927 * Reject an attempt to record a non-merge empty commit without
928 * explicit --allow-empty. In the cherry-pick case, it may be
929 * empty due to conflict resolution, which the user should okay.
930 */
931 if (!commitable && whence != FROM_MERGE && !allow_empty &&
Junio C Hamano06bb6432011-08-19 11:58:18 -0700932 !(amend && is_a_merge(current_head))) {
Matthieu Moy2556b992013-09-06 19:43:07 +0200933 s->display_comment_prefix = old_display_comment_prefix;
Junio C Hamanod249b092009-08-09 21:59:30 -0700934 run_status(stdout, index_file, prefix, 0, s);
Jeff Kingf197ed22010-06-06 20:41:46 -0400935 if (amend)
Ævar Arnfjörð Bjarmasonfc88e312011-02-22 23:41:49 +0000936 fputs(_(empty_amend_advice), stderr);
Jeff Kingc17592a2013-07-26 19:39:28 -0400937 else if (whence == FROM_CHERRY_PICK) {
Junio C Hamano6c80cd22011-04-01 17:55:55 -0700938 fputs(_(empty_cherry_pick_advice), stderr);
Jeff Kingc17592a2013-07-26 19:39:28 -0400939 if (!sequencer_in_use)
940 fputs(_(empty_cherry_pick_advice_single), stderr);
941 else
942 fputs(_(empty_cherry_pick_advice_multi), stderr);
943 }
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100944 return 0;
945 }
946
Kevin Willford680ee552017-08-14 15:54:25 -0600947 if (!no_verify && find_hook("pre-commit")) {
948 /*
949 * Re-read the index as pre-commit hook could have updated it,
950 * and write it out as a tree. We must do this before we invoke
951 * the editor and after we invoke run_status above.
952 */
953 discard_cache();
954 }
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100955 read_cache_from(index_file);
Kevin Willford680ee552017-08-14 15:54:25 -0600956
Thomas Rast996277c2011-12-06 18:43:37 +0100957 if (update_main_cache_tree(0)) {
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000958 error(_("Error building trees"));
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100959 return 0;
960 }
961
Benoit Pierre15048f82014-03-18 11:00:53 +0100962 if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
Pranit Bauvae51b0df2016-05-25 00:49:50 +0530963 git_path_commit_editmsg(), hook_arg1, hook_arg2, NULL))
Paolo Bonzini8089c852008-02-05 08:04:18 +0100964 return 0;
965
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100966 if (use_editor) {
Elia Pinto8d7aa4b2017-01-13 17:58:00 +0000967 struct argv_array env = ARGV_ARRAY_INIT;
968
969 argv_array_pushf(&env, "GIT_INDEX_FILE=%s", index_file);
970 if (launch_editor(git_path_commit_editmsg(), NULL, env.argv)) {
Stephan Beyer71982032008-07-25 18:28:42 +0200971 fprintf(stderr,
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +0000972 _("Please supply the message using either -m or -F option.\n"));
Stephan Beyer71982032008-07-25 18:28:42 +0200973 exit(1);
974 }
Elia Pinto8d7aa4b2017-01-13 17:58:00 +0000975 argv_array_clear(&env);
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100976 }
977
978 if (!no_verify &&
Pranit Bauvae51b0df2016-05-25 00:49:50 +0530979 run_commit_hook(use_editor, index_file, "commit-msg", git_path_commit_editmsg(), NULL)) {
Paolo Bonziniec84bd02008-02-05 11:01:46 +0100980 return 0;
981 }
982
983 return 1;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500984}
985
Junio C Hamanob2eda9b2012-03-30 12:14:33 -0700986static int rest_is_empty(struct strbuf *sb, int start)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500987{
Junio C Hamanob2eda9b2012-03-30 12:14:33 -0700988 int i, eol;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500989 const char *nl;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500990
Kaartic Sivaraam669638f2017-07-06 08:49:57 +0530991 /* Check if the rest is just whitespace and Signed-off-by's. */
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -0500992 for (i = start; i < sb->len; i++) {
993 nl = memchr(sb->buf + i, '\n', sb->len - i);
994 if (nl)
995 eol = nl - sb->buf;
996 else
997 eol = sb->len;
998
999 if (strlen(sign_off_header) <= eol - i &&
Christian Couder59556542013-11-30 21:55:40 +01001000 starts_with(sb->buf + i, sign_off_header)) {
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001001 i = eol;
1002 continue;
1003 }
1004 while (i < eol)
1005 if (!isspace(sb->buf[i++]))
1006 return 0;
1007 }
1008
1009 return 1;
1010}
1011
Junio C Hamanob2eda9b2012-03-30 12:14:33 -07001012/*
1013 * Find out if the message in the strbuf contains only whitespace and
1014 * Signed-off-by lines.
1015 */
1016static int message_is_empty(struct strbuf *sb)
1017{
1018 if (cleanup_mode == CLEANUP_NONE && sb->len)
1019 return 0;
1020 return rest_is_empty(sb, 0);
1021}
1022
1023/*
1024 * See if the user edited the message in the editor or left what
1025 * was in the template intact
1026 */
1027static int template_untouched(struct strbuf *sb)
1028{
1029 struct strbuf tmpl = STRBUF_INIT;
Jeff Kingcf4fff52014-06-18 15:44:19 -04001030 const char *start;
Junio C Hamanob2eda9b2012-03-30 12:14:33 -07001031
1032 if (cleanup_mode == CLEANUP_NONE && sb->len)
1033 return 0;
1034
1035 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1036 return 0;
1037
Tobias Klauser63af4a82015-10-16 17:16:42 +02001038 strbuf_stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
Jeff Kingcf4fff52014-06-18 15:44:19 -04001039 if (!skip_prefix(sb->buf, tmpl.buf, &start))
Junio C Hamanob2eda9b2012-03-30 12:14:33 -07001040 start = sb->buf;
1041 strbuf_release(&tmpl);
1042 return rest_is_empty(sb, start - sb->buf);
1043}
1044
Junio C Hamano146ea062008-08-26 23:13:13 -07001045static const char *find_author_by_nickname(const char *name)
1046{
1047 struct rev_info revs;
1048 struct commit *commit;
1049 struct strbuf buf = STRBUF_INIT;
Antoine Pelisseea167942013-08-23 15:48:31 +02001050 struct string_list mailmap = STRING_LIST_INIT_NODUP;
Junio C Hamano146ea062008-08-26 23:13:13 -07001051 const char *av[20];
1052 int ac = 0;
1053
1054 init_revisions(&revs, NULL);
1055 strbuf_addf(&buf, "--author=%s", name);
1056 av[++ac] = "--all";
1057 av[++ac] = "-i";
1058 av[++ac] = buf.buf;
1059 av[++ac] = NULL;
1060 setup_revisions(ac, av, &revs, NULL);
Antoine Pelisseea167942013-08-23 15:48:31 +02001061 revs.mailmap = &mailmap;
1062 read_mailmap(revs.mailmap, NULL);
1063
Stefan Beller81c3ce32014-08-10 23:33:26 +02001064 if (prepare_revision_walk(&revs))
1065 die(_("revision walk setup failed"));
Junio C Hamano146ea062008-08-26 23:13:13 -07001066 commit = get_revision(&revs);
1067 if (commit) {
Thomas Rastdd2e7942009-10-19 17:48:08 +02001068 struct pretty_print_context ctx = {0};
Jeff Kinga5481a62015-06-25 12:55:02 -04001069 ctx.date_mode.type = DATE_NORMAL;
Junio C Hamano146ea062008-08-26 23:13:13 -07001070 strbuf_release(&buf);
Antoine Pelisseea167942013-08-23 15:48:31 +02001071 format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
1072 clear_mailmap(&mailmap);
Junio C Hamano146ea062008-08-26 23:13:13 -07001073 return strbuf_detach(&buf, NULL);
1074 }
Michael J Gruber1044b1f2015-01-26 16:48:33 +01001075 die(_("--author '%s' is not 'Name <email>' and matches no existing author"), name);
Junio C Hamano146ea062008-08-26 23:13:13 -07001076}
1077
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001078
1079static void handle_untracked_files_arg(struct wt_status *s)
1080{
1081 if (!untracked_files_arg)
1082 ; /* default already initialized */
1083 else if (!strcmp(untracked_files_arg, "no"))
1084 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1085 else if (!strcmp(untracked_files_arg, "normal"))
1086 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1087 else if (!strcmp(untracked_files_arg, "all"))
1088 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1089 else
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001090 die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001091}
1092
Jay Soffian37f7a852011-02-19 23:12:29 -05001093static const char *read_commit_message(const char *name)
1094{
Jeff Kingdd0d3882013-01-26 04:44:06 -05001095 const char *out_enc;
Jay Soffian37f7a852011-02-19 23:12:29 -05001096 struct commit *commit;
1097
1098 commit = lookup_commit_reference_by_name(name);
1099 if (!commit)
Junio C Hamano6c80cd22011-04-01 17:55:55 -07001100 die(_("could not lookup commit %s"), name);
Jay Soffian37f7a852011-02-19 23:12:29 -05001101 out_enc = get_commit_output_encoding();
Nguyễn Thái Ngọc Duy5a10d232013-04-19 09:08:40 +10001102 return logmsg_reencode(commit, NULL, out_enc);
Jay Soffian37f7a852011-02-19 23:12:29 -05001103}
1104
Junio C Hamano84b42022013-06-24 11:41:40 -07001105/*
1106 * Enumerate what needs to be propagated when --porcelain
1107 * is not in effect here.
1108 */
1109static struct status_deferred_config {
Jeff Hostetlerbe7e7952016-08-05 18:00:27 -04001110 enum wt_status_format status_format;
Junio C Hamano84b42022013-06-24 11:41:40 -07001111 int show_branch;
1112} status_deferred_config = {
1113 STATUS_FORMAT_UNSPECIFIED,
1114 -1 /* unspecified */
1115};
1116
1117static void finalize_deferred_config(struct wt_status *s)
1118{
1119 int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
Jeff Hostetler1ecdecc2016-08-11 10:45:57 -04001120 status_format != STATUS_FORMAT_PORCELAIN_V2 &&
Junio C Hamano84b42022013-06-24 11:41:40 -07001121 !s->null_termination);
1122
1123 if (s->null_termination) {
1124 if (status_format == STATUS_FORMAT_NONE ||
1125 status_format == STATUS_FORMAT_UNSPECIFIED)
1126 status_format = STATUS_FORMAT_PORCELAIN;
1127 else if (status_format == STATUS_FORMAT_LONG)
1128 die(_("--long and -z are incompatible"));
1129 }
1130
1131 if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED)
1132 status_format = status_deferred_config.status_format;
1133 if (status_format == STATUS_FORMAT_UNSPECIFIED)
1134 status_format = STATUS_FORMAT_NONE;
1135
1136 if (use_deferred_config && s->show_branch < 0)
1137 s->show_branch = status_deferred_config.show_branch;
1138 if (s->show_branch < 0)
1139 s->show_branch = 0;
1140}
1141
Shawn Bohrer2f02b252007-12-02 23:02:09 -06001142static int parse_and_validate_options(int argc, const char *argv[],
Jeff King036dbbf2012-05-07 15:18:26 -04001143 const struct option *options,
Junio C Hamanodbd0f5c2008-08-06 11:43:47 -07001144 const char * const usage[],
Junio C Hamanod249b092009-08-09 21:59:30 -07001145 const char *prefix,
Junio C Hamano06bb6432011-08-19 11:58:18 -07001146 struct commit *current_head,
Junio C Hamanod249b092009-08-09 21:59:30 -07001147 struct wt_status *s)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001148{
1149 int f = 0;
1150
Jeff King036dbbf2012-05-07 15:18:26 -04001151 argc = parse_options(argc, argv, prefix, options, usage, 0);
Junio C Hamano84b42022013-06-24 11:41:40 -07001152 finalize_deferred_config(s);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001153
Junio C Hamano146ea062008-08-26 23:13:13 -07001154 if (force_author && !strchr(force_author, '>'))
1155 force_author = find_author_by_nickname(force_author);
1156
Erick Mattosc51f6ce2009-11-04 01:20:11 -02001157 if (force_author && renew_authorship)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001158 die(_("Using both --reset-author and --author does not make sense"));
Erick Mattosc51f6ce2009-11-04 01:20:11 -02001159
René Scharfe25206772013-05-25 23:43:34 +02001160 if (logfile || have_option_m || use_message || fixup_message)
Junio C Hamano48034662007-12-22 19:25:37 -08001161 use_editor = 0;
Junio C Hamanoca1ba202011-12-06 13:09:55 -08001162 if (0 <= edit_flag)
1163 use_editor = edit_flag;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001164
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001165 /* Sanity check options */
Junio C Hamano06bb6432011-08-19 11:58:18 -07001166 if (amend && !current_head)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001167 die(_("You have nothing to amend."));
Ævar Arnfjörð Bjarmasonb0cea472012-04-30 15:33:13 +00001168 if (amend && whence != FROM_COMMIT) {
1169 if (whence == FROM_MERGE)
1170 die(_("You are in the middle of a merge -- cannot amend."));
1171 else if (whence == FROM_CHERRY_PICK)
1172 die(_("You are in the middle of a cherry-pick -- cannot amend."));
1173 }
Pat Notz89ac1222010-11-02 13:59:11 -06001174 if (fixup_message && squash_message)
Ævar Arnfjörð Bjarmason9c227652011-02-22 23:41:45 +00001175 die(_("Options --squash and --fixup cannot be used together"));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001176 if (use_message)
1177 f++;
1178 if (edit_message)
1179 f++;
Pat Notzd71b8ba2010-11-02 13:59:09 -06001180 if (fixup_message)
1181 f++;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001182 if (logfile)
1183 f++;
1184 if (f > 1)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001185 die(_("Only one of -c/-C/-F/--fixup can be used."));
Jeff King27014cb2016-04-07 12:56:26 -07001186 if (have_option_m && f > 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001187 die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
Jeff King27014cb2016-04-07 12:56:26 -07001188 if (f || have_option_m)
Junio C Hamano010c7db2012-03-30 11:30:59 -07001189 template_file = NULL;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001190 if (edit_message)
1191 use_message = edit_message;
Pat Notzd71b8ba2010-11-02 13:59:09 -06001192 if (amend && !use_message && !fixup_message)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001193 use_message = "HEAD";
Jay Soffian37f7a852011-02-19 23:12:29 -05001194 if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001195 die(_("--reset-author can be used only with -C, -c or --amend."));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001196 if (use_message) {
Jay Soffian37f7a852011-02-19 23:12:29 -05001197 use_message_buffer = read_commit_message(use_message);
1198 if (!renew_authorship) {
1199 author_message = use_message;
1200 author_message_buffer = use_message_buffer;
1201 }
1202 }
1203 if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1204 author_message = "CHERRY_PICK_HEAD";
1205 author_message_buffer = read_commit_message(author_message);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001206 }
1207
Conrad Irwinb4bd4662011-05-07 10:58:07 -07001208 if (patch_interactive)
1209 interactive = 1;
1210
Stefan Beller05efb7b2013-08-07 09:32:25 +02001211 if (also + only + all + interactive > 1)
Conrad Irwinb4bd4662011-05-07 10:58:07 -07001212 die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
Andreas Krey319d8352016-12-02 23:15:13 +01001213 if (argc == 0 && (also || (only && !amend && !allow_empty)))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001214 die(_("No paths with --include/--only does not make sense."));
Alex Riesen5f065732007-12-22 19:46:24 +01001215 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1216 cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1217 else if (!strcmp(cleanup_arg, "verbatim"))
1218 cleanup_mode = CLEANUP_NONE;
1219 else if (!strcmp(cleanup_arg, "whitespace"))
1220 cleanup_mode = CLEANUP_SPACE;
1221 else if (!strcmp(cleanup_arg, "strip"))
1222 cleanup_mode = CLEANUP_ALL;
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +07001223 else if (!strcmp(cleanup_arg, "scissors"))
1224 cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
Alex Riesen5f065732007-12-22 19:46:24 +01001225 else
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001226 die(_("Invalid cleanup mode %s"), cleanup_arg);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001227
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001228 handle_untracked_files_arg(s);
Marius Storm-Olsen4bfee302008-06-05 10:31:19 +02001229
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001230 if (all && argc > 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001231 die(_("Paths with -a does not make sense."));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001232
Jeff Kingf3f47a12012-10-18 21:15:50 +07001233 if (status_format != STATUS_FORMAT_NONE)
Jeff King7c9f7032009-09-05 04:59:56 -04001234 dry_run = 1;
1235
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001236 return argc;
1237}
1238
Junio C Hamanod249b092009-08-09 21:59:30 -07001239static int dry_run_commit(int argc, const char **argv, const char *prefix,
Junio C Hamano06bb6432011-08-19 11:58:18 -07001240 const struct commit *current_head, struct wt_status *s)
Junio C Hamano3a5d13a2009-08-07 23:03:36 -07001241{
1242 int commitable;
1243 const char *index_file;
1244
Junio C Hamano06bb6432011-08-19 11:58:18 -07001245 index_file = prepare_index(argc, argv, prefix, current_head, 1);
Junio C Hamanod249b092009-08-09 21:59:30 -07001246 commitable = run_status(stdout, index_file, prefix, 0, s);
Junio C Hamano3a5d13a2009-08-07 23:03:36 -07001247 rollback_index_files();
1248
1249 return commitable ? 0 : 1;
1250}
1251
Jonathan Nieder88521172014-10-07 15:16:57 -04001252static int parse_status_slot(const char *slot)
Junio C Hamanof766b362009-08-09 23:12:19 -07001253{
Jonathan Nieder88521172014-10-07 15:16:57 -04001254 if (!strcasecmp(slot, "header"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001255 return WT_STATUS_HEADER;
Jonathan Nieder88521172014-10-07 15:16:57 -04001256 if (!strcasecmp(slot, "branch"))
Aleksi Aalto1d282322010-11-18 01:40:05 +02001257 return WT_STATUS_ONBRANCH;
Jonathan Nieder88521172014-10-07 15:16:57 -04001258 if (!strcasecmp(slot, "updated") || !strcasecmp(slot, "added"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001259 return WT_STATUS_UPDATED;
Jonathan Nieder88521172014-10-07 15:16:57 -04001260 if (!strcasecmp(slot, "changed"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001261 return WT_STATUS_CHANGED;
Jonathan Nieder88521172014-10-07 15:16:57 -04001262 if (!strcasecmp(slot, "untracked"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001263 return WT_STATUS_UNTRACKED;
Jonathan Nieder88521172014-10-07 15:16:57 -04001264 if (!strcasecmp(slot, "nobranch"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001265 return WT_STATUS_NOBRANCH;
Jonathan Nieder88521172014-10-07 15:16:57 -04001266 if (!strcasecmp(slot, "unmerged"))
Junio C Hamanof766b362009-08-09 23:12:19 -07001267 return WT_STATUS_UNMERGED;
Stephen Kent93fdf302017-04-21 22:42:02 -07001268 if (!strcasecmp(slot, "localBranch"))
1269 return WT_STATUS_LOCAL_BRANCH;
1270 if (!strcasecmp(slot, "remoteBranch"))
1271 return WT_STATUS_REMOTE_BRANCH;
Jeff King8b8e8622009-12-12 07:25:24 -05001272 return -1;
Junio C Hamanof766b362009-08-09 23:12:19 -07001273}
1274
1275static int git_status_config(const char *k, const char *v, void *cb)
1276{
1277 struct wt_status *s = cb;
René Scharfee3f1da92014-10-04 20:54:50 +02001278 const char *slot_name;
Junio C Hamanof766b362009-08-09 23:12:19 -07001279
Christian Couder59556542013-11-30 21:55:40 +01001280 if (starts_with(k, "column."))
Jeff King4d2292e2012-05-07 15:35:03 -04001281 return git_column_config(k, v, "status", &s->colopts);
Junio C Hamanof766b362009-08-09 23:12:19 -07001282 if (!strcmp(k, "status.submodulesummary")) {
1283 int is_bool;
1284 s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1285 if (is_bool && s->submodule_summary)
1286 s->submodule_summary = -1;
1287 return 0;
1288 }
Jorge Juan Garcia Garcia4fb51662013-06-11 15:34:04 +02001289 if (!strcmp(k, "status.short")) {
1290 if (git_config_bool(k, v))
Junio C Hamano84b42022013-06-24 11:41:40 -07001291 status_deferred_config.status_format = STATUS_FORMAT_SHORT;
Jorge Juan Garcia Garcia4fb51662013-06-11 15:34:04 +02001292 else
Junio C Hamano84b42022013-06-24 11:41:40 -07001293 status_deferred_config.status_format = STATUS_FORMAT_NONE;
Jorge Juan Garcia Garcia4fb51662013-06-11 15:34:04 +02001294 return 0;
1295 }
Jorge Juan Garcia Garciaec85d072013-06-11 15:34:05 +02001296 if (!strcmp(k, "status.branch")) {
Junio C Hamano84b42022013-06-24 11:41:40 -07001297 status_deferred_config.show_branch = git_config_bool(k, v);
Jorge Juan Garcia Garciaec85d072013-06-11 15:34:05 +02001298 return 0;
1299 }
Liam Beguinc1b5d012017-06-17 18:30:51 -04001300 if (!strcmp(k, "status.showstash")) {
1301 s->show_stash = git_config_bool(k, v);
1302 return 0;
1303 }
Junio C Hamanof766b362009-08-09 23:12:19 -07001304 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
Jeff Kinge269eb72011-08-17 22:03:48 -07001305 s->use_color = git_config_colorbool(k, v);
Junio C Hamanof766b362009-08-09 23:12:19 -07001306 return 0;
1307 }
Matthieu Moy2556b992013-09-06 19:43:07 +02001308 if (!strcmp(k, "status.displaycommentprefix")) {
1309 s->display_comment_prefix = git_config_bool(k, v);
1310 return 0;
1311 }
René Scharfee3f1da92014-10-04 20:54:50 +02001312 if (skip_prefix(k, "status.color.", &slot_name) ||
1313 skip_prefix(k, "color.status.", &slot_name)) {
Junio C Hamanob9465762014-10-20 12:23:48 -07001314 int slot = parse_status_slot(slot_name);
Jeff King8b8e8622009-12-12 07:25:24 -05001315 if (slot < 0)
1316 return 0;
Junio C Hamanof766b362009-08-09 23:12:19 -07001317 if (!v)
1318 return config_error_nonbool(k);
Jeff Kingf6c5a292014-10-07 15:33:09 -04001319 return color_parse(v, s->color_palette[slot]);
Junio C Hamanof766b362009-08-09 23:12:19 -07001320 }
1321 if (!strcmp(k, "status.relativepaths")) {
1322 s->relative_paths = git_config_bool(k, v);
1323 return 0;
1324 }
1325 if (!strcmp(k, "status.showuntrackedfiles")) {
1326 if (!v)
1327 return config_error_nonbool(k);
1328 else if (!strcmp(v, "no"))
1329 s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1330 else if (!strcmp(v, "normal"))
1331 s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1332 else if (!strcmp(v, "all"))
1333 s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1334 else
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001335 return error(_("Invalid untracked files mode '%s'"), v);
Junio C Hamanof766b362009-08-09 23:12:19 -07001336 return 0;
1337 }
1338 return git_diff_ui_config(k, v, NULL);
1339}
1340
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001341int cmd_status(int argc, const char **argv, const char *prefix)
1342{
Jeff King036dbbf2012-05-07 15:18:26 -04001343 static struct wt_status s;
Markus Heidelberg4bb66442010-04-02 23:44:21 +02001344 int fd;
brian m. carlson8066df42017-02-20 00:10:14 +00001345 struct object_id oid;
Junio C Hamano9e4b7ab2009-08-15 02:27:39 -07001346 static struct option builtin_status_options[] = {
Nguyễn Thái Ngọc Duyf2276312012-08-20 19:32:37 +07001347 OPT__VERBOSE(&verbose, N_("be verbose")),
Jeff Kingdd2be242009-09-05 04:54:14 -04001348 OPT_SET_INT('s', "short", &status_format,
Nguyễn Thái Ngọc Duyf2276312012-08-20 19:32:37 +07001349 N_("show status concisely"), STATUS_FORMAT_SHORT),
Junio C Hamano84b42022013-06-24 11:41:40 -07001350 OPT_BOOL('b', "branch", &s.show_branch,
1351 N_("show branch information")),
Liam Beguinc1b5d012017-06-17 18:30:51 -04001352 OPT_BOOL(0, "show-stash", &s.show_stash,
1353 N_("show stash information")),
Jeff Hostetlerc4f596b2016-08-05 18:00:28 -04001354 { OPTION_CALLBACK, 0, "porcelain", &status_format,
1355 N_("version"), N_("machine-readable output"),
1356 PARSE_OPT_OPTARG, opt_parse_porcelain },
Jeff Kingf3f47a12012-10-18 21:15:50 +07001357 OPT_SET_INT(0, "long", &status_format,
1358 N_("show status in long format (default)"),
1359 STATUS_FORMAT_LONG),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001360 OPT_BOOL('z', "null", &s.null_termination,
1361 N_("terminate entries with NUL")),
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001362 { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
Nguyễn Thái Ngọc Duyf2276312012-08-20 19:32:37 +07001363 N_("mode"),
1364 N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001365 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001366 OPT_BOOL(0, "ignored", &show_ignored_in_status,
1367 N_("show ignored files")),
Nguyễn Thái Ngọc Duyf2276312012-08-20 19:32:37 +07001368 { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
1369 N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
Jens Lehmann46a958b2010-06-25 16:56:47 +02001370 PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001371 OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001372 OPT_END(),
1373 };
1374
Nguyễn Thái Ngọc Duy5d3dd912010-10-22 01:45:47 -05001375 if (argc == 2 && !strcmp(argv[1], "-h"))
1376 usage_with_options(builtin_status_usage, builtin_status_options);
1377
Matthieu Moy5c25dfa2013-09-12 12:50:04 +02001378 status_init_config(&s, git_status_config);
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001379 argc = parse_options(argc, argv, prefix,
Junio C Hamano9e4b7ab2009-08-15 02:27:39 -07001380 builtin_status_options,
1381 builtin_status_usage, 0);
Jeff King4d2292e2012-05-07 15:35:03 -04001382 finalize_colopts(&s.colopts, -1);
Junio C Hamano84b42022013-06-24 11:41:40 -07001383 finalize_deferred_config(&s);
Junio C Hamano6c929722011-06-06 11:40:08 -07001384
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001385 handle_untracked_files_arg(&s);
Junio C Hamano2381e392010-04-10 00:33:17 -07001386 if (show_ignored_in_status)
1387 s.show_ignored_files = 1;
Nguyễn Thái Ngọc Duy15b55ae2013-07-14 15:35:39 +07001388 parse_pathspec(&s.pathspec, 0,
1389 PATHSPEC_PREFER_FULL,
1390 prefix, argv);
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001391
Nguyễn Thái Ngọc Duy5ab2a2d2013-07-14 15:35:49 +07001392 read_cache_preload(&s.pathspec);
Nguyễn Thái Ngọc Duy9b2d6142013-07-14 15:35:54 +07001393 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
Markus Heidelberg4bb66442010-04-02 23:44:21 +02001394
Jeff King27344d62017-09-27 02:54:30 -04001395 if (use_optional_locks())
1396 fd = hold_locked_index(&index_lock, 0);
1397 else
1398 fd = -1;
Markus Heidelberg4bb66442010-04-02 23:44:21 +02001399
brian m. carlsone82caf32017-07-13 23:49:28 +00001400 s.is_initial = get_oid(s.reference, &oid) ? 1 : 0;
Jeff Hostetlerd9fc7462016-08-11 10:45:59 -04001401 if (!s.is_initial)
brian m. carlson8066df42017-02-20 00:10:14 +00001402 hashcpy(s.sha1_commit, oid.hash);
Jeff Hostetlerd9fc7462016-08-11 10:45:59 -04001403
Jens Lehmann46a958b2010-06-25 16:56:47 +02001404 s.ignore_submodule_arg = ignore_submodule_arg;
Jeff Hostetlerbe7e7952016-08-05 18:00:27 -04001405 s.status_format = status_format;
1406 s.verbose = verbose;
1407
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001408 wt_status_collect(&s);
1409
Nguyễn Thái Ngọc Duy226c0512015-03-08 17:12:41 +07001410 if (0 <= fd)
1411 update_index_if_able(&the_index, &index_lock);
1412
Jeff King86617682009-12-07 00:26:25 -05001413 if (s.relative_paths)
1414 s.prefix = prefix;
Markus Heidelberg38920dd2009-01-08 19:53:05 +01001415
Jeff Hostetlerbe7e7952016-08-05 18:00:27 -04001416 wt_status_print(&s);
Junio C Hamano76e2f7c2009-08-07 23:31:57 -07001417 return 0;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001418}
1419
Matthieu Moy8b27ff72014-07-25 21:11:36 +02001420static const char *implicit_ident_advice(void)
1421{
Nguyễn Thái Ngọc Duy4aad2f12017-04-05 17:24:38 +07001422 char *user_config = expand_user_path("~/.gitconfig", 0);
Paul Tane682c9d2015-05-06 16:01:02 +08001423 char *xdg_config = xdg_config_home("config");
1424 int config_exists = file_exists(user_config) || file_exists(xdg_config);
Matthieu Moy8b27ff72014-07-25 21:11:36 +02001425
Matthieu Moy8b27ff72014-07-25 21:11:36 +02001426 free(user_config);
1427 free(xdg_config);
1428
1429 if (config_exists)
1430 return _(implicit_ident_advice_config);
1431 else
1432 return _(implicit_ident_advice_noconfig);
1433
1434}
1435
brian m. carlson8066df42017-02-20 00:10:14 +00001436static void print_summary(const char *prefix, const struct object_id *oid,
Junio C Hamano06bb6432011-08-19 11:58:18 -07001437 int initial_commit)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001438{
1439 struct rev_info rev;
1440 struct commit *commit;
Jeff King49ff9a72010-01-13 12:39:51 -05001441 struct strbuf format = STRBUF_INIT;
Nguyễn Thái Ngọc Duyd5a35c12011-11-13 17:22:15 +07001442 const char *head;
Jeff King49ff9a72010-01-13 12:39:51 -05001443 struct pretty_print_context pctx = {0};
1444 struct strbuf author_ident = STRBUF_INIT;
1445 struct strbuf committer_ident = STRBUF_INIT;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001446
brian m. carlsonbc832662017-05-06 22:10:10 +00001447 commit = lookup_commit(oid);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001448 if (!commit)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001449 die(_("couldn't look up newly created commit"));
Jeff King5e7d4d32013-10-24 04:53:19 -04001450 if (parse_commit(commit))
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001451 die(_("could not parse newly created commit"));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001452
Jeff King49ff9a72010-01-13 12:39:51 -05001453 strbuf_addstr(&format, "format:%h] %s");
1454
1455 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1456 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1457 if (strbuf_cmp(&author_ident, &committer_ident)) {
1458 strbuf_addstr(&format, "\n Author: ");
1459 strbuf_addbuf_percentquote(&format, &author_ident);
1460 }
Jeff Kingb7242b82014-05-01 21:10:01 -04001461 if (author_date_is_interesting()) {
1462 struct strbuf date = STRBUF_INIT;
1463 format_commit_message(commit, "%ad", &date, &pctx);
1464 strbuf_addstr(&format, "\n Date: ");
1465 strbuf_addbuf_percentquote(&format, &date);
1466 strbuf_release(&date);
1467 }
Jeff Kingd6991ce2012-11-14 16:34:13 -08001468 if (!committer_ident_sufficiently_given()) {
Jeff King49ff9a72010-01-13 12:39:51 -05001469 strbuf_addstr(&format, "\n Committer: ");
1470 strbuf_addbuf_percentquote(&format, &committer_ident);
Jeff Kingb706fcf2010-01-13 15:17:08 -05001471 if (advice_implicit_identity) {
1472 strbuf_addch(&format, '\n');
Matthieu Moy8b27ff72014-07-25 21:11:36 +02001473 strbuf_addstr(&format, implicit_ident_advice());
Jeff Kingb706fcf2010-01-13 15:17:08 -05001474 }
Jeff King49ff9a72010-01-13 12:39:51 -05001475 }
1476 strbuf_release(&author_ident);
1477 strbuf_release(&committer_ident);
1478
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001479 init_revisions(&rev, prefix);
1480 setup_revisions(0, NULL, &rev, NULL);
1481
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001482 rev.diff = 1;
1483 rev.diffopt.output_format =
1484 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1485
1486 rev.verbose_header = 1;
1487 rev.show_root_diff = 1;
Jeff King49ff9a72010-01-13 12:39:51 -05001488 get_commit_format(format.buf, &rev);
Junio C Hamanobf82a152007-12-10 21:02:26 -08001489 rev.always_show_header = 0;
Junio C Hamano3eb2a152007-12-16 15:05:39 -08001490 rev.diffopt.detect_rename = 1;
Junio C Hamano3eb2a152007-12-16 15:05:39 -08001491 rev.diffopt.break_opt = 0;
Junio C Hamano15964562007-12-16 15:03:58 -08001492 diff_setup_done(&rev.diffopt);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001493
René Scharfe744c0402017-09-23 11:45:04 +02001494 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
Andrey Okoshkinc26de082017-10-20 14:03:28 +03001495 if (!head)
1496 die_errno(_("unable to resolve HEAD after creating commit"));
René Scharfee3f1da92014-10-04 20:54:50 +02001497 if (!strcmp(head, "HEAD"))
1498 head = _("detached HEAD");
1499 else
1500 skip_prefix(head, "refs/heads/", &head);
1501 printf("[%s%s ", head, initial_commit ? _(" (root-commit)") : "");
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001502
Junio C Hamanobf82a152007-12-10 21:02:26 -08001503 if (!log_tree_commit(&rev, commit)) {
Tay Ray Chuana45e1a82010-06-12 22:15:39 +08001504 rev.always_show_header = 1;
1505 rev.use_terminator = 1;
1506 log_tree_commit(&rev, commit);
Junio C Hamanobf82a152007-12-10 21:02:26 -08001507 }
Tay Ray Chuana45e1a82010-06-12 22:15:39 +08001508
Junio C Hamanofc6f19f2010-01-17 00:57:51 -08001509 strbuf_release(&format);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001510}
1511
Stephan Beyer186458b2008-07-24 01:09:35 +02001512static int git_commit_config(const char *k, const char *v, void *cb)
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001513{
Junio C Hamanod249b092009-08-09 21:59:30 -07001514 struct wt_status *s = cb;
Junio C Hamanoba3c69a2011-10-05 17:23:20 -07001515 int status;
Junio C Hamanod249b092009-08-09 21:59:30 -07001516
Brian Hetro984c6e72008-07-05 01:24:40 -04001517 if (!strcmp(k, "commit.template"))
Matthieu Moy395de252009-11-17 18:24:25 +01001518 return git_config_pathname(&template_file, k, v);
James P. Howard, IIbed575e2009-12-07 17:45:27 -05001519 if (!strcmp(k, "commit.status")) {
1520 include_status = git_config_bool(k, v);
1521 return 0;
1522 }
Ralf Thielow51fb3a32013-01-10 18:45:59 +01001523 if (!strcmp(k, "commit.cleanup"))
1524 return git_config_string(&cleanup_arg, k, v);
Nicolas Vigierd95bfb12013-11-05 00:14:41 +01001525 if (!strcmp(k, "commit.gpgsign")) {
1526 sign_commit = git_config_bool(k, v) ? "" : NULL;
1527 return 0;
1528 }
Pranit Bauvaaaab8422016-05-05 15:20:02 +05301529 if (!strcmp(k, "commit.verbose")) {
1530 int is_bool;
1531 config_commit_verbose = git_config_bool_or_int(k, v, &is_bool);
1532 return 0;
1533 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001534
Junio C Hamanoba3c69a2011-10-05 17:23:20 -07001535 status = git_gpg_config(k, v, NULL);
1536 if (status)
1537 return status;
Junio C Hamanod249b092009-08-09 21:59:30 -07001538 return git_status_config(k, v, s);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001539}
1540
brian m. carlson8066df42017-02-20 00:10:14 +00001541static int run_rewrite_hook(const struct object_id *oldoid,
1542 const struct object_id *newoid)
Thomas Rast6f6bee32010-03-12 18:04:28 +01001543{
René Scharfed3180272014-08-19 21:09:35 +02001544 struct child_process proc = CHILD_PROCESS_INIT;
Thomas Rast6f6bee32010-03-12 18:04:28 +01001545 const char *argv[3];
1546 int code;
Elia Pinto4a528192017-01-31 13:45:35 +00001547 struct strbuf sb = STRBUF_INIT;
Thomas Rast6f6bee32010-03-12 18:04:28 +01001548
Aaron Schrab5a7da2d2013-01-13 00:17:02 -05001549 argv[0] = find_hook("post-rewrite");
1550 if (!argv[0])
Thomas Rast6f6bee32010-03-12 18:04:28 +01001551 return 0;
1552
Thomas Rast6f6bee32010-03-12 18:04:28 +01001553 argv[1] = "amend";
1554 argv[2] = NULL;
1555
Thomas Rast6f6bee32010-03-12 18:04:28 +01001556 proc.argv = argv;
1557 proc.in = -1;
1558 proc.stdout_to_stderr = 1;
1559
1560 code = start_command(&proc);
1561 if (code)
1562 return code;
brian m. carlson8066df42017-02-20 00:10:14 +00001563 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
Clemens Buchacheraf65f682015-11-16 09:05:58 +01001564 sigchain_push(SIGPIPE, SIG_IGN);
Elia Pinto4a528192017-01-31 13:45:35 +00001565 write_in_full(proc.in, sb.buf, sb.len);
Thomas Rast6f6bee32010-03-12 18:04:28 +01001566 close(proc.in);
Elia Pinto4a528192017-01-31 13:45:35 +00001567 strbuf_release(&sb);
Clemens Buchacheraf65f682015-11-16 09:05:58 +01001568 sigchain_pop(SIGPIPE);
Thomas Rast6f6bee32010-03-12 18:04:28 +01001569 return finish_command(&proc);
1570}
1571
Benoit Pierre15048f82014-03-18 11:00:53 +01001572int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
1573{
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001574 struct argv_array hook_env = ARGV_ARRAY_INIT;
Benoit Pierre15048f82014-03-18 11:00:53 +01001575 va_list args;
1576 int ret;
1577
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001578 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", index_file);
Benoit Pierre15048f82014-03-18 11:00:53 +01001579
1580 /*
1581 * Let the hook know that no editor will be launched.
1582 */
1583 if (!editor_is_used)
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001584 argv_array_push(&hook_env, "GIT_EDITOR=:");
Benoit Pierre15048f82014-03-18 11:00:53 +01001585
1586 va_start(args, name);
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001587 ret = run_hook_ve(hook_env.argv,name, args);
Benoit Pierre15048f82014-03-18 11:00:53 +01001588 va_end(args);
Elia Pinto8d7aa4b2017-01-13 17:58:00 +00001589 argv_array_clear(&hook_env);
Benoit Pierre15048f82014-03-18 11:00:53 +01001590
1591 return ret;
1592}
1593
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001594int cmd_commit(int argc, const char **argv, const char *prefix)
1595{
Jeff King036dbbf2012-05-07 15:18:26 -04001596 static struct wt_status s;
1597 static struct option builtin_commit_options[] = {
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001598 OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
1599 OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
Jeff King036dbbf2012-05-07 15:18:26 -04001600
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001601 OPT_GROUP(N_("Commit message options")),
1602 OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
1603 OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
1604 OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
1605 OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
1606 OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
1607 OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
1608 OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
1609 OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001610 OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
1611 OPT_BOOL('s', "signoff", &signoff, N_("add Signed-off-by:")),
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001612 OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
1613 OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
1614 OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001615 OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
Junio C Hamanoe703d712014-03-23 15:58:12 -07001616 { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001617 N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
Jeff King036dbbf2012-05-07 15:18:26 -04001618 /* end commit message options */
1619
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001620 OPT_GROUP(N_("Commit contents options")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001621 OPT_BOOL('a', "all", &all, N_("commit all changed files")),
1622 OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")),
1623 OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
1624 OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
1625 OPT_BOOL('o', "only", &only, N_("commit only specified files")),
Orgad Shanehdef480f2016-07-26 17:00:15 +03001626 OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit and commit-msg hooks")),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001627 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 +07001628 OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
Jeff King036dbbf2012-05-07 15:18:26 -04001629 STATUS_FORMAT_SHORT),
Junio C Hamano84b42022013-06-24 11:41:40 -07001630 OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
Jeff King036dbbf2012-05-07 15:18:26 -04001631 OPT_SET_INT(0, "porcelain", &status_format,
Nguyễn Thái Ngọc Duy9c23f4c2012-08-20 19:32:04 +07001632 N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
Jeff Kingf3f47a12012-10-18 21:15:50 +07001633 OPT_SET_INT(0, "long", &status_format,
1634 N_("show status in long format (default)"),
1635 STATUS_FORMAT_LONG),
Stefan Bellerd5d09d42013-08-03 13:51:19 +02001636 OPT_BOOL('z', "null", &s.null_termination,
1637 N_("terminate entries with NUL")),
1638 OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
1639 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 +07001640 { 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 -04001641 /* end commit contents options */
1642
Stefan Beller4741edd2013-08-03 13:51:18 +02001643 OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
1644 N_("ok to record an empty change")),
1645 OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message,
1646 N_("ok to record a change with an empty message")),
Jeff King036dbbf2012-05-07 15:18:26 -04001647
1648 OPT_END()
1649 };
1650
Brandon Caseyf285a2d2008-10-09 14:12:12 -05001651 struct strbuf sb = STRBUF_INIT;
Junio C Hamano4c28e4a2010-12-20 17:00:36 -08001652 struct strbuf author_ident = STRBUF_INIT;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001653 const char *index_file, *reflog_msg;
Jens Lehmann1a72cfd2013-12-05 20:44:14 +01001654 char *nl;
brian m. carlson8066df42017-02-20 00:10:14 +00001655 struct object_id oid;
René Scharfede9f7fa2016-10-29 14:55:36 +02001656 struct commit_list *parents = NULL;
Miklos Vajnacf10f9f2008-10-03 14:04:47 +02001657 struct stat statbuf;
Junio C Hamano06bb6432011-08-19 11:58:18 -07001658 struct commit *current_head = NULL;
Junio C Hamanoed7a42a2011-11-08 15:38:07 -08001659 struct commit_extra_header *extra = NULL;
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001660 struct ref_transaction *transaction;
1661 struct strbuf err = STRBUF_INIT;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001662
Nguyễn Thái Ngọc Duy5d3dd912010-10-22 01:45:47 -05001663 if (argc == 2 && !strcmp(argv[1], "-h"))
1664 usage_with_options(builtin_commit_usage, builtin_commit_options);
1665
Matthieu Moy5c25dfa2013-09-12 12:50:04 +02001666 status_init_config(&s, git_commit_config);
Kaartic Sivaraam4ddb1352017-06-21 23:46:14 +05301667 s.commit_template = 1;
Ramkumar Ramachandraf0915cb2013-06-24 18:15:12 +05301668 status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
Jeff King4d2292e2012-05-07 15:35:03 -04001669 s.colopts = 0;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001670
brian m. carlsone82caf32017-07-13 23:49:28 +00001671 if (get_oid("HEAD", &oid))
Junio C Hamano06bb6432011-08-19 11:58:18 -07001672 current_head = NULL;
1673 else {
brian m. carlsonbc832662017-05-06 22:10:10 +00001674 current_head = lookup_commit_or_die(&oid, "HEAD");
Jeff King5e7d4d32013-10-24 04:53:19 -04001675 if (parse_commit(current_head))
Junio C Hamano06bb6432011-08-19 11:58:18 -07001676 die(_("could not parse HEAD commit"));
1677 }
Pranit Bauvaaaab8422016-05-05 15:20:02 +05301678 verbose = -1; /* unspecified */
Jeff King036dbbf2012-05-07 15:18:26 -04001679 argc = parse_and_validate_options(argc, argv, builtin_commit_options,
1680 builtin_commit_usage,
Junio C Hamano06bb6432011-08-19 11:58:18 -07001681 prefix, current_head, &s);
Pranit Bauvaaaab8422016-05-05 15:20:02 +05301682 if (verbose == -1)
1683 verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose;
1684
Jeff Kingc9bfb952011-08-17 22:05:35 -07001685 if (dry_run)
Junio C Hamano06bb6432011-08-19 11:58:18 -07001686 return dry_run_commit(argc, argv, prefix, current_head, &s);
Junio C Hamano06bb6432011-08-19 11:58:18 -07001687 index_file = prepare_index(argc, argv, prefix, current_head, 0);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001688
Paolo Bonziniec84bd02008-02-05 11:01:46 +01001689 /* Set up everything for writing the commit object. This includes
1690 running hooks, writing the trees, and interacting with the user. */
Junio C Hamano06bb6432011-08-19 11:58:18 -07001691 if (!prepare_to_commit(index_file, prefix,
1692 current_head, &s, &author_ident)) {
Junio C Hamano28886052007-11-18 01:52:55 -08001693 rollback_index_files();
1694 return 1;
1695 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001696
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001697 /* Determine parents */
Christian Couder643cb5f2010-06-12 18:05:12 +02001698 reflog_msg = getenv("GIT_REFLOG_ACTION");
Junio C Hamano06bb6432011-08-19 11:58:18 -07001699 if (!current_head) {
Christian Couder643cb5f2010-06-12 18:05:12 +02001700 if (!reflog_msg)
1701 reflog_msg = "commit (initial)";
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001702 } else if (amend) {
Christian Couder643cb5f2010-06-12 18:05:12 +02001703 if (!reflog_msg)
1704 reflog_msg = "commit (amend)";
René Scharfede9f7fa2016-10-29 14:55:36 +02001705 parents = copy_commit_list(current_head->parents);
Jay Soffian37f7a852011-02-19 23:12:29 -05001706 } else if (whence == FROM_MERGE) {
Brandon Caseyf285a2d2008-10-09 14:12:12 -05001707 struct strbuf m = STRBUF_INIT;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001708 FILE *fp;
Elia Pintoe23fd152014-01-30 07:15:56 -08001709 int allow_fast_forward = 1;
René Scharfede9f7fa2016-10-29 14:55:36 +02001710 struct commit_list **pptr = &parents;
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001711
Christian Couder643cb5f2010-06-12 18:05:12 +02001712 if (!reflog_msg)
1713 reflog_msg = "commit (merge)";
René Scharfede9f7fa2016-10-29 14:55:36 +02001714 pptr = commit_list_append(current_head, pptr);
Nguyễn Thái Ngọc Duy23a9e072017-05-03 17:16:46 +07001715 fp = xfopen(git_path_merge_head(), "r");
Junio C Hamano8f309ae2016-01-13 15:31:17 -08001716 while (strbuf_getline_lf(&m, fp) != EOF) {
Junio C Hamano5231c632011-11-07 16:21:32 -08001717 struct commit *parent;
1718
1719 parent = get_merge_parent(m.buf);
1720 if (!parent)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001721 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
René Scharfede9f7fa2016-10-29 14:55:36 +02001722 pptr = commit_list_append(parent, pptr);
Linus Torvalds7c3fd252008-01-15 16:12:33 -08001723 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001724 fclose(fp);
1725 strbuf_release(&m);
Jeff Kingf9327292015-08-10 05:38:57 -04001726 if (!stat(git_path_merge_mode(), &statbuf)) {
1727 if (strbuf_read_file(&sb, git_path_merge_mode(), 0) < 0)
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001728 die_errno(_("could not read MERGE_MODE"));
Miklos Vajnacf10f9f2008-10-03 14:04:47 +02001729 if (!strcmp(sb.buf, "no-ff"))
1730 allow_fast_forward = 0;
1731 }
1732 if (allow_fast_forward)
Martin Ågren4da72642017-11-07 21:39:45 +01001733 reduce_heads_replace(&parents);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001734 } else {
Christian Couder643cb5f2010-06-12 18:05:12 +02001735 if (!reflog_msg)
Jay Soffian37f7a852011-02-19 23:12:29 -05001736 reflog_msg = (whence == FROM_CHERRY_PICK)
1737 ? "commit (cherry-pick)"
1738 : "commit";
René Scharfede9f7fa2016-10-29 14:55:36 +02001739 commit_list_insert(current_head, &parents);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001740 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001741
Paolo Bonziniec84bd02008-02-05 11:01:46 +01001742 /* Finally, get the commit message */
Miklos Vajnacf10f9f2008-10-03 14:04:47 +02001743 strbuf_reset(&sb);
Pranit Bauvae51b0df2016-05-25 00:49:50 +05301744 if (strbuf_read_file(&sb, git_path_commit_editmsg(), 0) < 0) {
Thomas Rast0721c312009-06-27 17:58:47 +02001745 int saved_errno = errno;
Junio C Hamano740001a2007-12-08 23:23:20 -08001746 rollback_index_files();
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001747 die(_("could not read commit message: %s"), strerror(saved_errno));
Junio C Hamano740001a2007-12-08 23:23:20 -08001748 }
Kristian Høgsberg99a12692007-11-21 21:54:49 -05001749
Nguyễn Thái Ngọc Duy75df1f42014-02-17 19:15:32 +07001750 if (verbose || /* Truncate the message just before the diff, if any. */
1751 cleanup_mode == CLEANUP_SCISSORS)
Brian Malehornd76650b2017-05-15 23:06:49 -07001752 strbuf_setlen(&sb, wt_status_locate_end(sb.buf, sb.len));
Alex Riesen5f065732007-12-22 19:46:24 +01001753 if (cleanup_mode != CLEANUP_NONE)
Tobias Klauser63af4a82015-10-16 17:16:42 +02001754 strbuf_stripspace(&sb, cleanup_mode == CLEANUP_ALL);
Kaartic Sivaraambc17f352017-07-17 21:06:15 +05301755
Ævar Arnfjörð Bjarmasonc9b5fde2010-04-06 08:40:35 +00001756 if (message_is_empty(&sb) && !allow_empty_message) {
Junio C Hamano28886052007-11-18 01:52:55 -08001757 rollback_index_files();
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001758 fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
Jeff Kingfdc7c812008-07-31 03:36:09 -04001759 exit(1);
Junio C Hamano28886052007-11-18 01:52:55 -08001760 }
Kaartic Sivaraambc17f352017-07-17 21:06:15 +05301761 if (template_untouched(&sb) && !allow_empty_message) {
1762 rollback_index_files();
1763 fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
1764 exit(1);
1765 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001766
Junio C Hamano0074d182011-12-20 13:20:56 -08001767 if (amend) {
Junio C Hamanoc871a1d2012-01-05 10:54:14 -08001768 const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1769 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
Junio C Hamano0074d182011-12-20 13:20:56 -08001770 } else {
1771 struct commit_extra_header **tail = &extra;
1772 append_merge_tag_headers(parents, &tail);
1773 }
Junio C Hamanoed7a42a2011-11-08 15:38:07 -08001774
brian m. carlsone0a92802017-05-01 02:28:56 +00001775 if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->oid.hash,
brian m. carlson8066df42017-02-20 00:10:14 +00001776 parents, oid.hash, author_ident.buf, sign_commit, extra)) {
Junio C Hamano28886052007-11-18 01:52:55 -08001777 rollback_index_files();
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001778 die(_("failed to write commit object"));
Junio C Hamano28886052007-11-18 01:52:55 -08001779 }
Junio C Hamano4c28e4a2010-12-20 17:00:36 -08001780 strbuf_release(&author_ident);
Junio C Hamanoed7a42a2011-11-08 15:38:07 -08001781 free_commit_extra_headers(extra);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001782
Miklos Vajna6bb6b032008-09-10 22:10:32 +02001783 nl = strchr(sb.buf, '\n');
Johannes Schindelin741707b2007-11-08 12:15:26 +00001784 if (nl)
1785 strbuf_setlen(&sb, nl + 1 - sb.buf);
1786 else
1787 strbuf_addch(&sb, '\n');
Johannes Schindelin741707b2007-11-08 12:15:26 +00001788 strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1789 strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001790
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001791 transaction = ref_transaction_begin(&err);
1792 if (!transaction ||
brian m. carlson8066df42017-02-20 00:10:14 +00001793 ref_transaction_update(transaction, "HEAD", oid.hash,
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001794 current_head
brian m. carlsoned1c9972015-11-10 02:22:29 +00001795 ? current_head->object.oid.hash : null_sha1,
Michael Haggerty1d147bd2015-02-17 18:00:15 +01001796 0, sb.buf, &err) ||
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -07001797 ref_transaction_commit(transaction, &err)) {
Junio C Hamano28886052007-11-18 01:52:55 -08001798 rollback_index_files();
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001799 die("%s", err.buf);
Junio C Hamano28886052007-11-18 01:52:55 -08001800 }
Ronnie Sahlbergc0fe1ed2014-04-16 15:34:19 -07001801 ref_transaction_free(transaction);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001802
Jeff Kingf9327292015-08-10 05:38:57 -04001803 unlink(git_path_cherry_pick_head());
1804 unlink(git_path_revert_head());
1805 unlink(git_path_merge_head());
1806 unlink(git_path_merge_msg());
1807 unlink(git_path_merge_mode());
1808 unlink(git_path_squash_msg());
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001809
Brandon Casey5a9dd392008-01-23 11:21:22 -06001810 if (commit_index_files())
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001811 die (_("Repository has been updated, but unable to write\n"
Alex Henriead5fe372014-08-30 13:56:01 -06001812 "new_index file. Check that disk is not full and quota is\n"
Ævar Arnfjörð Bjarmason8a6179b2011-02-22 23:41:44 +00001813 "not exceeded, and then \"git reset HEAD\" to recover."));
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001814
Junio C Hamanocb6020b2009-12-04 00:20:48 -08001815 rerere(0);
Benoit Pierre15048f82014-03-18 11:00:53 +01001816 run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
Thomas Rast6f6bee32010-03-12 18:04:28 +01001817 if (amend && !no_post_rewrite) {
Thomas Rast6360d342010-03-12 18:04:34 +01001818 struct notes_rewrite_cfg *cfg;
1819 cfg = init_copy_notes_for_rewrite("amend");
1820 if (cfg) {
Junio C Hamano06bb6432011-08-19 11:58:18 -07001821 /* we are amending, so current_head is not NULL */
brian m. carlsonbb7e4732017-05-30 10:30:42 -07001822 copy_note_for_rewrite(cfg, &current_head->object.oid, &oid);
Johan Herland80a14662013-06-12 02:12:59 +02001823 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
Thomas Rast6360d342010-03-12 18:04:34 +01001824 }
brian m. carlson8066df42017-02-20 00:10:14 +00001825 run_rewrite_hook(&current_head->object.oid, &oid);
Thomas Rast6f6bee32010-03-12 18:04:28 +01001826 }
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001827 if (!quiet)
brian m. carlson8066df42017-02-20 00:10:14 +00001828 print_summary(prefix, &oid, !current_head);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001829
Jeff King0e5bba52017-09-08 02:38:41 -04001830 UNLEAK(err);
1831 UNLEAK(sb);
Kristian Høgsbergf5bbc322007-11-08 11:59:00 -05001832 return 0;
1833}