Git fork
at reftables-rust 1988 lines 62 kB view raw
1/* 2 * Builtin "git commit" 3 * 4 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com> 5 * Based on git-commit.sh by Junio C Hamano and Linus Torvalds 6 */ 7 8#define USE_THE_REPOSITORY_VARIABLE 9#define DISABLE_SIGN_COMPARE_WARNINGS 10 11#include "builtin.h" 12#include "advice.h" 13#include "config.h" 14#include "lockfile.h" 15#include "cache-tree.h" 16#include "color.h" 17#include "dir.h" 18#include "editor.h" 19#include "environment.h" 20#include "diff.h" 21#include "commit.h" 22#include "add-interactive.h" 23#include "gettext.h" 24#include "revision.h" 25#include "wt-status.h" 26#include "run-command.h" 27#include "strbuf.h" 28#include "object-name.h" 29#include "parse-options.h" 30#include "path.h" 31#include "preload-index.h" 32#include "read-cache.h" 33#include "repository.h" 34#include "string-list.h" 35#include "rerere.h" 36#include "unpack-trees.h" 37#include "column.h" 38#include "sequencer.h" 39#include "sparse-index.h" 40#include "mailmap.h" 41#include "help.h" 42#include "commit-reach.h" 43#include "commit-graph.h" 44#include "pretty.h" 45#include "trailer.h" 46 47static const char * const builtin_commit_usage[] = { 48 N_("git commit [-a | --interactive | --patch] [-s] [-v] [-u[<mode>]] [--amend]\n" 49 " [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|reword):]<commit>]\n" 50 " [-F <file> | -m <msg>] [--reset-author] [--allow-empty]\n" 51 " [--allow-empty-message] [--no-verify] [-e] [--author=<author>]\n" 52 " [--date=<date>] [--cleanup=<mode>] [--[no-]status]\n" 53 " [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" 54 " [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]\n" 55 " [--] [<pathspec>...]"), 56 NULL 57}; 58 59static const char * const builtin_status_usage[] = { 60 N_("git status [<options>] [--] [<pathspec>...]"), 61 NULL 62}; 63 64static const char empty_amend_advice[] = 65N_("You asked to amend the most recent commit, but doing so would make\n" 66"it empty. You can repeat your command with --allow-empty, or you can\n" 67"remove the commit entirely with \"git reset HEAD^\".\n"); 68 69static const char empty_cherry_pick_advice[] = 70N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n" 71"If you wish to commit it anyway, use:\n" 72"\n" 73" git commit --allow-empty\n" 74"\n"); 75 76static const char empty_rebase_pick_advice[] = 77N_("Otherwise, please use 'git rebase --skip'\n"); 78 79static const char empty_cherry_pick_advice_single[] = 80N_("Otherwise, please use 'git cherry-pick --skip'\n"); 81 82static const char empty_cherry_pick_advice_multi[] = 83N_("and then use:\n" 84"\n" 85" git cherry-pick --continue\n" 86"\n" 87"to resume cherry-picking the remaining commits.\n" 88"If you wish to skip this commit, use:\n" 89"\n" 90" git cherry-pick --skip\n" 91"\n"); 92 93static const char *color_status_slots[] = { 94 [WT_STATUS_HEADER] = "header", 95 [WT_STATUS_UPDATED] = "updated", 96 [WT_STATUS_CHANGED] = "changed", 97 [WT_STATUS_UNTRACKED] = "untracked", 98 [WT_STATUS_NOBRANCH] = "noBranch", 99 [WT_STATUS_UNMERGED] = "unmerged", 100 [WT_STATUS_LOCAL_BRANCH] = "localBranch", 101 [WT_STATUS_REMOTE_BRANCH] = "remoteBranch", 102 [WT_STATUS_ONBRANCH] = "branch", 103}; 104 105static const char *use_message_buffer; 106static struct lock_file index_lock; /* real index */ 107static struct lock_file false_lock; /* used only for partial commits */ 108static enum { 109 COMMIT_AS_IS = 1, 110 COMMIT_NORMAL, 111 COMMIT_PARTIAL 112} commit_style; 113 114static const char *force_author; 115static char *logfile; 116static char *template_file; 117/* 118 * The _message variables are commit names from which to take 119 * the commit message and/or authorship. 120 */ 121static const char *author_message, *author_message_buffer; 122static const char *edit_message, *use_message; 123static char *fixup_message, *fixup_commit, *squash_message; 124static const char *fixup_prefix; 125static int all, also, interactive, patch_interactive, only, amend, signoff; 126static struct add_p_opt add_p_opt = ADD_P_OPT_INIT; 127static int edit_flag = -1; /* unspecified */ 128static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship; 129static int config_commit_verbose = -1; /* unspecified */ 130static int no_post_rewrite, allow_empty_message, pathspec_file_nul; 131static const char *untracked_files_arg, *force_date, *ignore_submodule_arg, *ignored_arg; 132static const char *sign_commit, *pathspec_from_file; 133static struct strvec trailer_args = STRVEC_INIT; 134 135/* 136 * The default commit message cleanup mode will remove the lines 137 * beginning with # (shell comments) and leading and trailing 138 * whitespaces (empty lines or containing only whitespaces) 139 * if editor is used, and only the whitespaces if the message 140 * is specified explicitly. 141 */ 142static enum commit_msg_cleanup_mode cleanup_mode; 143static char *cleanup_config; 144 145static enum commit_whence whence; 146static int use_editor = 1, include_status = 1; 147static int have_option_m; 148static struct strbuf message = STRBUF_INIT; 149 150static enum wt_status_format status_format = STATUS_FORMAT_UNSPECIFIED; 151 152static int opt_parse_porcelain(const struct option *opt, const char *arg, int unset) 153{ 154 enum wt_status_format *value = (enum wt_status_format *)opt->value; 155 if (unset) 156 *value = STATUS_FORMAT_NONE; 157 else if (!arg) 158 *value = STATUS_FORMAT_PORCELAIN; 159 else if (!strcmp(arg, "v1") || !strcmp(arg, "1")) 160 *value = STATUS_FORMAT_PORCELAIN; 161 else if (!strcmp(arg, "v2") || !strcmp(arg, "2")) 162 *value = STATUS_FORMAT_PORCELAIN_V2; 163 else 164 die("unsupported porcelain version '%s'", arg); 165 166 return 0; 167} 168 169static int opt_parse_m(const struct option *opt, const char *arg, int unset) 170{ 171 struct strbuf *buf = opt->value; 172 if (unset) { 173 have_option_m = 0; 174 strbuf_setlen(buf, 0); 175 } else { 176 have_option_m = 1; 177 if (buf->len) 178 strbuf_addch(buf, '\n'); 179 strbuf_addstr(buf, arg); 180 strbuf_complete_line(buf); 181 } 182 return 0; 183} 184 185static int opt_parse_rename_score(const struct option *opt, const char *arg, int unset) 186{ 187 const char **value = opt->value; 188 189 BUG_ON_OPT_NEG(unset); 190 191 if (arg != NULL && *arg == '=') 192 arg = arg + 1; 193 194 *value = arg; 195 return 0; 196} 197 198static void determine_whence(struct wt_status *s) 199{ 200 if (file_exists(git_path_merge_head(the_repository))) 201 whence = FROM_MERGE; 202 else if (!sequencer_determine_whence(the_repository, &whence)) 203 whence = FROM_COMMIT; 204 if (s) 205 s->whence = whence; 206} 207 208static void status_init_config(struct wt_status *s, config_fn_t fn) 209{ 210 wt_status_prepare(the_repository, s); 211 init_diff_ui_defaults(); 212 repo_config(the_repository, fn, s); 213 determine_whence(s); 214 s->hints = advice_enabled(ADVICE_STATUS_HINTS); /* must come after repo_config() */ 215} 216 217static void rollback_index_files(void) 218{ 219 switch (commit_style) { 220 case COMMIT_AS_IS: 221 break; /* nothing to do */ 222 case COMMIT_NORMAL: 223 rollback_lock_file(&index_lock); 224 break; 225 case COMMIT_PARTIAL: 226 rollback_lock_file(&index_lock); 227 rollback_lock_file(&false_lock); 228 break; 229 } 230} 231 232static int commit_index_files(void) 233{ 234 int err = 0; 235 236 switch (commit_style) { 237 case COMMIT_AS_IS: 238 break; /* nothing to do */ 239 case COMMIT_NORMAL: 240 err = commit_lock_file(&index_lock); 241 break; 242 case COMMIT_PARTIAL: 243 err = commit_lock_file(&index_lock); 244 rollback_lock_file(&false_lock); 245 break; 246 } 247 248 return err; 249} 250 251/* 252 * Take a union of paths in the index and the named tree (typically, "HEAD"), 253 * and return the paths that match the given pattern in list. 254 */ 255static int list_paths(struct string_list *list, const char *with_tree, 256 const struct pathspec *pattern) 257{ 258 int i, ret; 259 char *m; 260 261 if (!pattern->nr) 262 return 0; 263 264 m = xcalloc(1, pattern->nr); 265 266 if (with_tree) { 267 char *max_prefix = common_prefix(pattern); 268 overlay_tree_on_index(the_repository->index, with_tree, max_prefix); 269 free(max_prefix); 270 } 271 272 /* TODO: audit for interaction with sparse-index. */ 273 ensure_full_index(the_repository->index); 274 for (i = 0; i < the_repository->index->cache_nr; i++) { 275 const struct cache_entry *ce = the_repository->index->cache[i]; 276 struct string_list_item *item; 277 278 if (ce->ce_flags & CE_UPDATE) 279 continue; 280 if (!ce_path_match(the_repository->index, ce, pattern, m)) 281 continue; 282 item = string_list_insert(list, ce->name); 283 if (ce_skip_worktree(ce)) 284 item->util = item; /* better a valid pointer than a fake one */ 285 } 286 287 ret = report_path_error(m, pattern); 288 free(m); 289 return ret; 290} 291 292static void add_remove_files(struct string_list *list) 293{ 294 int i; 295 for (i = 0; i < list->nr; i++) { 296 struct stat st; 297 struct string_list_item *p = &(list->items[i]); 298 299 /* p->util is skip-worktree */ 300 if (p->util) 301 continue; 302 303 if (!lstat(p->string, &st)) { 304 if (add_to_index(the_repository->index, p->string, &st, 0)) 305 die(_("updating files failed")); 306 } else 307 remove_file_from_index(the_repository->index, p->string); 308 } 309} 310 311static void create_base_index(const struct commit *current_head) 312{ 313 struct tree *tree; 314 struct unpack_trees_options opts; 315 struct tree_desc t; 316 317 if (!current_head) { 318 discard_index(the_repository->index); 319 return; 320 } 321 322 memset(&opts, 0, sizeof(opts)); 323 opts.head_idx = 1; 324 opts.index_only = 1; 325 opts.merge = 1; 326 opts.src_index = the_repository->index; 327 opts.dst_index = the_repository->index; 328 329 opts.fn = oneway_merge; 330 tree = parse_tree_indirect(&current_head->object.oid); 331 if (!tree) 332 die(_("failed to unpack HEAD tree object")); 333 if (parse_tree(tree) < 0) 334 exit(128); 335 init_tree_desc(&t, &tree->object.oid, tree->buffer, tree->size); 336 if (unpack_trees(1, &t, &opts)) 337 exit(128); /* We've already reported the error, finish dying */ 338} 339 340static void refresh_cache_or_die(int refresh_flags) 341{ 342 /* 343 * refresh_flags contains REFRESH_QUIET, so the only errors 344 * are for unmerged entries. 345 */ 346 if (refresh_index(the_repository->index, refresh_flags | REFRESH_IN_PORCELAIN, NULL, NULL, NULL)) 347 die_resolve_conflict("commit"); 348} 349 350static const char *prepare_index(const char **argv, const char *prefix, 351 const struct commit *current_head, int is_status) 352{ 353 struct string_list partial = STRING_LIST_INIT_DUP; 354 struct pathspec pathspec; 355 int refresh_flags = REFRESH_QUIET; 356 const char *ret; 357 char *path = NULL; 358 359 if (add_p_opt.context < -1) 360 die(_("'%s' cannot be negative"), "--unified"); 361 if (add_p_opt.interhunkcontext < -1) 362 die(_("'%s' cannot be negative"), "--inter-hunk-context"); 363 364 if (is_status) 365 refresh_flags |= REFRESH_UNMERGED; 366 parse_pathspec(&pathspec, 0, 367 PATHSPEC_PREFER_FULL, 368 prefix, argv); 369 370 if (pathspec_from_file) { 371 if (interactive) 372 die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "--interactive/--patch"); 373 374 if (all) 375 die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "-a"); 376 377 if (pathspec.nr) 378 die(_("'%s' and pathspec arguments cannot be used together"), "--pathspec-from-file"); 379 380 parse_pathspec_file(&pathspec, 0, 381 PATHSPEC_PREFER_FULL, 382 prefix, pathspec_from_file, pathspec_file_nul); 383 } else if (pathspec_file_nul) { 384 die(_("the option '%s' requires '%s'"), "--pathspec-file-nul", "--pathspec-from-file"); 385 } 386 387 if (!pathspec.nr && (also || (only && !allow_empty && 388 (!amend || (fixup_message && strcmp(fixup_prefix, "amend")))))) 389 die(_("No paths with --include/--only does not make sense.")); 390 391 if (repo_read_index_preload(the_repository, &pathspec, 0) < 0) 392 die(_("index file corrupt")); 393 394 if (interactive) { 395 char *old_index_env = NULL, *old_repo_index_file; 396 repo_hold_locked_index(the_repository, &index_lock, 397 LOCK_DIE_ON_ERROR); 398 399 refresh_cache_or_die(refresh_flags); 400 401 if (write_locked_index(the_repository->index, &index_lock, 0)) 402 die(_("unable to create temporary index")); 403 404 old_repo_index_file = the_repository->index_file; 405 the_repository->index_file = 406 (char *)get_lock_file_path(&index_lock); 407 old_index_env = xstrdup_or_null(getenv(INDEX_ENVIRONMENT)); 408 setenv(INDEX_ENVIRONMENT, the_repository->index_file, 1); 409 410 if (interactive_add(the_repository, argv, prefix, patch_interactive, &add_p_opt) != 0) 411 die(_("interactive add failed")); 412 413 the_repository->index_file = old_repo_index_file; 414 if (old_index_env && *old_index_env) 415 setenv(INDEX_ENVIRONMENT, old_index_env, 1); 416 else 417 unsetenv(INDEX_ENVIRONMENT); 418 FREE_AND_NULL(old_index_env); 419 420 discard_index(the_repository->index); 421 read_index_from(the_repository->index, get_lock_file_path(&index_lock), 422 repo_get_git_dir(the_repository)); 423 if (cache_tree_update(the_repository->index, WRITE_TREE_SILENT) == 0) { 424 if (reopen_lock_file(&index_lock) < 0) 425 die(_("unable to write index file")); 426 if (write_locked_index(the_repository->index, &index_lock, 0)) 427 die(_("unable to update temporary index")); 428 } else 429 warning(_("Failed to update main cache tree")); 430 431 commit_style = COMMIT_NORMAL; 432 ret = get_lock_file_path(&index_lock); 433 goto out; 434 } else { 435 if (add_p_opt.context != -1) 436 die(_("the option '%s' requires '%s'"), "--unified", "--interactive/--patch"); 437 if (add_p_opt.interhunkcontext != -1) 438 die(_("the option '%s' requires '%s'"), "--inter-hunk-context", "--interactive/--patch"); 439 } 440 441 /* 442 * Non partial, non as-is commit. 443 * 444 * (1) get the real index; 445 * (2) update the_index as necessary; 446 * (3) write the_index out to the real index (still locked); 447 * (4) return the name of the locked index file. 448 * 449 * The caller should run hooks on the locked real index, and 450 * (A) if all goes well, commit the real index; 451 * (B) on failure, rollback the real index. 452 */ 453 if (all || (also && pathspec.nr)) { 454 char *ps_matched = xcalloc(pathspec.nr, 1); 455 repo_hold_locked_index(the_repository, &index_lock, 456 LOCK_DIE_ON_ERROR); 457 add_files_to_cache(the_repository, also ? prefix : NULL, 458 &pathspec, ps_matched, 0, 0); 459 if (!all && report_path_error(ps_matched, &pathspec)) 460 exit(128); 461 462 refresh_cache_or_die(refresh_flags); 463 cache_tree_update(the_repository->index, WRITE_TREE_SILENT); 464 if (write_locked_index(the_repository->index, &index_lock, 0)) 465 die(_("unable to write new index file")); 466 commit_style = COMMIT_NORMAL; 467 ret = get_lock_file_path(&index_lock); 468 free(ps_matched); 469 goto out; 470 } 471 472 /* 473 * As-is commit. 474 * 475 * (1) return the name of the real index file. 476 * 477 * The caller should run hooks on the real index, 478 * and create commit from the_index. 479 * We still need to refresh the index here. 480 */ 481 if (!only && !pathspec.nr) { 482 repo_hold_locked_index(the_repository, &index_lock, 483 LOCK_DIE_ON_ERROR); 484 refresh_cache_or_die(refresh_flags); 485 if (the_repository->index->cache_changed 486 || !cache_tree_fully_valid(the_repository->index->cache_tree)) 487 cache_tree_update(the_repository->index, WRITE_TREE_SILENT); 488 if (write_locked_index(the_repository->index, &index_lock, 489 COMMIT_LOCK | SKIP_IF_UNCHANGED)) 490 die(_("unable to write new index file")); 491 commit_style = COMMIT_AS_IS; 492 ret = repo_get_index_file(the_repository); 493 goto out; 494 } 495 496 /* 497 * A partial commit. 498 * 499 * (0) find the set of affected paths; 500 * (1) get lock on the real index file; 501 * (2) update the_index with the given paths; 502 * (3) write the_index out to the real index (still locked); 503 * (4) get lock on the false index file; 504 * (5) reset the_index from HEAD; 505 * (6) update the_index the same way as (2); 506 * (7) write the_index out to the false index file; 507 * (8) return the name of the false index file (still locked); 508 * 509 * The caller should run hooks on the locked false index, and 510 * create commit from it. Then 511 * (A) if all goes well, commit the real index; 512 * (B) on failure, rollback the real index; 513 * In either case, rollback the false index. 514 */ 515 commit_style = COMMIT_PARTIAL; 516 517 if (whence != FROM_COMMIT) { 518 if (whence == FROM_MERGE) 519 die(_("cannot do a partial commit during a merge.")); 520 else if (is_from_cherry_pick(whence)) 521 die(_("cannot do a partial commit during a cherry-pick.")); 522 else if (is_from_rebase(whence)) 523 die(_("cannot do a partial commit during a rebase.")); 524 } 525 526 if (list_paths(&partial, !current_head ? NULL : "HEAD", &pathspec)) 527 exit(1); 528 529 discard_index(the_repository->index); 530 if (repo_read_index(the_repository) < 0) 531 die(_("cannot read the index")); 532 533 repo_hold_locked_index(the_repository, &index_lock, LOCK_DIE_ON_ERROR); 534 add_remove_files(&partial); 535 refresh_index(the_repository->index, REFRESH_QUIET, NULL, NULL, NULL); 536 cache_tree_update(the_repository->index, WRITE_TREE_SILENT); 537 if (write_locked_index(the_repository->index, &index_lock, 0)) 538 die(_("unable to write new index file")); 539 540 path = repo_git_path(the_repository, "next-index-%"PRIuMAX, 541 (uintmax_t) getpid()); 542 hold_lock_file_for_update(&false_lock, path, 543 LOCK_DIE_ON_ERROR); 544 545 create_base_index(current_head); 546 add_remove_files(&partial); 547 refresh_index(the_repository->index, REFRESH_QUIET, NULL, NULL, NULL); 548 549 if (write_locked_index(the_repository->index, &false_lock, 0)) 550 die(_("unable to write temporary index file")); 551 552 discard_index(the_repository->index); 553 ret = get_lock_file_path(&false_lock); 554 read_index_from(the_repository->index, ret, repo_get_git_dir(the_repository)); 555out: 556 string_list_clear(&partial, 0); 557 clear_pathspec(&pathspec); 558 free(path); 559 return ret; 560} 561 562static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn, 563 struct wt_status *s) 564{ 565 struct object_id oid; 566 567 if (s->relative_paths) 568 s->prefix = prefix; 569 570 if (amend) { 571 s->amend = 1; 572 s->reference = "HEAD^1"; 573 } 574 s->verbose = verbose; 575 s->index_file = index_file; 576 s->fp = fp; 577 s->nowarn = nowarn; 578 s->is_initial = repo_get_oid(the_repository, s->reference, &oid) ? 1 : 0; 579 if (!s->is_initial) 580 oidcpy(&s->oid_commit, &oid); 581 s->status_format = status_format; 582 s->ignore_submodule_arg = ignore_submodule_arg; 583 584 wt_status_collect(s); 585 wt_status_print(s); 586 wt_status_collect_free_buffers(s); 587 588 return s->committable; 589} 590 591static int is_a_merge(const struct commit *current_head) 592{ 593 return !!(current_head->parents && current_head->parents->next); 594} 595 596static void assert_split_ident(struct ident_split *id, const struct strbuf *buf) 597{ 598 if (split_ident_line(id, buf->buf, buf->len) || !id->date_begin) 599 BUG("unable to parse our own ident: %s", buf->buf); 600} 601 602static void export_one(const char *var, const char *s, const char *e, int hack) 603{ 604 struct strbuf buf = STRBUF_INIT; 605 if (hack) 606 strbuf_addch(&buf, hack); 607 strbuf_add(&buf, s, e - s); 608 setenv(var, buf.buf, 1); 609 strbuf_release(&buf); 610} 611 612static int parse_force_date(const char *in, struct strbuf *out) 613{ 614 strbuf_addch(out, '@'); 615 616 if (parse_date(in, out) < 0) { 617 int errors = 0; 618 unsigned long t = approxidate_careful(in, &errors); 619 if (errors) 620 return -1; 621 strbuf_addf(out, "%lu", t); 622 } 623 624 return 0; 625} 626 627static void set_ident_var(char **buf, char *val) 628{ 629 free(*buf); 630 *buf = val; 631} 632 633static void determine_author_info(struct strbuf *author_ident) 634{ 635 char *name, *email, *date; 636 struct ident_split author; 637 638 name = xstrdup_or_null(getenv("GIT_AUTHOR_NAME")); 639 email = xstrdup_or_null(getenv("GIT_AUTHOR_EMAIL")); 640 date = xstrdup_or_null(getenv("GIT_AUTHOR_DATE")); 641 642 if (author_message) { 643 struct ident_split ident; 644 size_t len; 645 const char *a; 646 647 a = find_commit_header(author_message_buffer, "author", &len); 648 if (!a) 649 die(_("commit '%s' lacks author header"), author_message); 650 if (split_ident_line(&ident, a, len) < 0) 651 die(_("commit '%s' has malformed author line"), author_message); 652 653 set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin)); 654 set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin)); 655 656 if (ident.date_begin) { 657 struct strbuf date_buf = STRBUF_INIT; 658 strbuf_addch(&date_buf, '@'); 659 strbuf_add(&date_buf, ident.date_begin, ident.date_end - ident.date_begin); 660 strbuf_addch(&date_buf, ' '); 661 strbuf_add(&date_buf, ident.tz_begin, ident.tz_end - ident.tz_begin); 662 set_ident_var(&date, strbuf_detach(&date_buf, NULL)); 663 } 664 } 665 666 if (force_author) { 667 struct ident_split ident; 668 669 if (split_ident_line(&ident, force_author, strlen(force_author)) < 0) 670 die(_("malformed --author parameter")); 671 set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin)); 672 set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin)); 673 } 674 675 if (force_date) { 676 struct strbuf date_buf = STRBUF_INIT; 677 if (parse_force_date(force_date, &date_buf)) 678 die(_("invalid date format: %s"), force_date); 679 set_ident_var(&date, strbuf_detach(&date_buf, NULL)); 680 } 681 682 strbuf_addstr(author_ident, fmt_ident(name, email, WANT_AUTHOR_IDENT, date, 683 IDENT_STRICT)); 684 assert_split_ident(&author, author_ident); 685 export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0); 686 export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0); 687 export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@'); 688 free(name); 689 free(email); 690 free(date); 691} 692 693static int author_date_is_interesting(void) 694{ 695 return author_message || force_date; 696} 697 698#ifndef WITH_BREAKING_CHANGES 699static void adjust_comment_line_char(const struct strbuf *sb) 700{ 701 char candidates[] = "#;@!$%^&|:"; 702 char *candidate; 703 const char *p; 704 size_t cutoff; 705 706 /* Ignore comment chars in trailing comments (e.g., Conflicts:) */ 707 cutoff = sb->len - ignored_log_message_bytes(sb->buf, sb->len); 708 709 if (!memchr(sb->buf, candidates[0], sb->len)) { 710 free(comment_line_str_to_free); 711 comment_line_str = comment_line_str_to_free = 712 xstrfmt("%c", candidates[0]); 713 return; 714 } 715 716 p = sb->buf; 717 candidate = strchr(candidates, *p); 718 if (candidate) 719 *candidate = ' '; 720 for (p = sb->buf; p + 1 < sb->buf + cutoff; p++) { 721 if ((p[0] == '\n' || p[0] == '\r') && p[1]) { 722 candidate = strchr(candidates, p[1]); 723 if (candidate) 724 *candidate = ' '; 725 } 726 } 727 728 for (p = candidates; *p == ' '; p++) 729 ; 730 if (!*p) 731 die(_("unable to select a comment character that is not used\n" 732 "in the current commit message")); 733 free(comment_line_str_to_free); 734 comment_line_str = comment_line_str_to_free = xstrfmt("%c", *p); 735} 736#endif /* !WITH_BREAKING_CHANGES */ 737 738static void prepare_amend_commit(struct commit *commit, struct strbuf *sb, 739 struct pretty_print_context *ctx) 740{ 741 const char *buffer, *subject, *fmt; 742 743 buffer = repo_get_commit_buffer(the_repository, commit, NULL); 744 find_commit_subject(buffer, &subject); 745 /* 746 * If we amend the 'amend!' commit then we don't want to 747 * duplicate the subject line. 748 */ 749 fmt = starts_with(subject, "amend!") ? "%b" : "%B"; 750 repo_format_commit_message(the_repository, commit, fmt, sb, ctx); 751 repo_unuse_commit_buffer(the_repository, commit, buffer); 752} 753 754static void change_data_free(void *util, const char *str UNUSED) 755{ 756 struct wt_status_change_data *d = util; 757 free(d->rename_source); 758 free(d); 759} 760 761static int prepare_to_commit(const char *index_file, const char *prefix, 762 struct commit *current_head, 763 struct wt_status *s, 764 struct strbuf *author_ident) 765{ 766 struct stat statbuf; 767 struct strbuf committer_ident = STRBUF_INIT; 768 int committable; 769 struct strbuf sb = STRBUF_INIT; 770 const char *hook_arg1 = NULL; 771 const char *hook_arg2 = NULL; 772 int clean_message_contents = (cleanup_mode != COMMIT_MSG_CLEANUP_NONE); 773 int old_display_comment_prefix; 774 int invoked_hook; 775 776 /* This checks and barfs if author is badly specified */ 777 determine_author_info(author_ident); 778 779 if (!no_verify && run_commit_hook(use_editor, index_file, &invoked_hook, 780 "pre-commit", NULL)) 781 return 0; 782 783 if (squash_message) { 784 /* 785 * Insert the proper subject line before other commit 786 * message options add their content. 787 */ 788 if (use_message && !strcmp(use_message, squash_message)) 789 strbuf_addstr(&sb, "squash! "); 790 else { 791 struct pretty_print_context ctx = {0}; 792 struct commit *c; 793 c = lookup_commit_reference_by_name(squash_message); 794 if (!c) 795 die(_("could not lookup commit '%s'"), squash_message); 796 ctx.output_encoding = get_commit_output_encoding(); 797 repo_format_commit_message(the_repository, c, 798 "squash! %s\n\n", &sb, 799 &ctx); 800 } 801 } 802 803 if (have_option_m && !fixup_message) { 804 strbuf_addbuf(&sb, &message); 805 hook_arg1 = "message"; 806 } else if (logfile && !strcmp(logfile, "-")) { 807 if (isatty(0)) 808 fprintf(stderr, _("(reading log message from standard input)\n")); 809 if (strbuf_read(&sb, 0, 0) < 0) 810 die_errno(_("could not read log from standard input")); 811 hook_arg1 = "message"; 812 } else if (logfile) { 813 if (strbuf_read_file(&sb, logfile, 0) < 0) 814 die_errno(_("could not read log file '%s'"), 815 logfile); 816 hook_arg1 = "message"; 817 } else if (use_message) { 818 char *buffer; 819 buffer = strstr(use_message_buffer, "\n\n"); 820 if (buffer) 821 strbuf_addstr(&sb, skip_blank_lines(buffer + 2)); 822 hook_arg1 = "commit"; 823 hook_arg2 = use_message; 824 } else if (fixup_message) { 825 struct pretty_print_context ctx = {0}; 826 struct commit *commit; 827 char *fmt; 828 commit = lookup_commit_reference_by_name(fixup_commit); 829 if (!commit) 830 die(_("could not lookup commit '%s'"), fixup_commit); 831 ctx.output_encoding = get_commit_output_encoding(); 832 fmt = xstrfmt("%s! %%s\n\n", fixup_prefix); 833 repo_format_commit_message(the_repository, commit, fmt, &sb, 834 &ctx); 835 free(fmt); 836 hook_arg1 = "message"; 837 838 /* 839 * Only `-m` commit message option is checked here, as 840 * it supports `--fixup` to append the commit message. 841 * 842 * The other commit message options `-c`/`-C`/`-F` are 843 * incompatible with all the forms of `--fixup` and 844 * have already errored out while parsing the `git commit` 845 * options. 846 */ 847 if (have_option_m && !strcmp(fixup_prefix, "fixup")) 848 strbuf_addbuf(&sb, &message); 849 850 if (!strcmp(fixup_prefix, "amend")) { 851 if (have_option_m) 852 die(_("options '%s' and '%s:%s' cannot be used together"), "-m", "--fixup", fixup_message); 853 prepare_amend_commit(commit, &sb, &ctx); 854 } 855 } else if (!stat(git_path_merge_msg(the_repository), &statbuf)) { 856 size_t merge_msg_start; 857 858 /* 859 * prepend SQUASH_MSG here if it exists and a 860 * "merge --squash" was originally performed 861 */ 862 if (!stat(git_path_squash_msg(the_repository), &statbuf)) { 863 if (strbuf_read_file(&sb, git_path_squash_msg(the_repository), 0) < 0) 864 die_errno(_("could not read SQUASH_MSG")); 865 hook_arg1 = "squash"; 866 } else 867 hook_arg1 = "merge"; 868 869 merge_msg_start = sb.len; 870 if (strbuf_read_file(&sb, git_path_merge_msg(the_repository), 0) < 0) 871 die_errno(_("could not read MERGE_MSG")); 872 873 if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS && 874 wt_status_locate_end(sb.buf + merge_msg_start, 875 sb.len - merge_msg_start) < 876 sb.len - merge_msg_start) 877 s->added_cut_line = 1; 878 } else if (!stat(git_path_squash_msg(the_repository), &statbuf)) { 879 if (strbuf_read_file(&sb, git_path_squash_msg(the_repository), 0) < 0) 880 die_errno(_("could not read SQUASH_MSG")); 881 hook_arg1 = "squash"; 882 } else if (template_file) { 883 if (strbuf_read_file(&sb, template_file, 0) < 0) 884 die_errno(_("could not read '%s'"), template_file); 885 hook_arg1 = "template"; 886 clean_message_contents = 0; 887 } 888 889 /* 890 * The remaining cases don't modify the template message, but 891 * just set the argument(s) to the prepare-commit-msg hook. 892 */ 893 else if (whence == FROM_MERGE) 894 hook_arg1 = "merge"; 895 else if (is_from_cherry_pick(whence) || whence == FROM_REBASE_PICK) { 896 hook_arg1 = "commit"; 897 hook_arg2 = "CHERRY_PICK_HEAD"; 898 } 899 900 if (squash_message) { 901 /* 902 * If squash_commit was used for the commit subject, 903 * then we're possibly hijacking other commit log options. 904 * Reset the hook args to tell the real story. 905 */ 906 hook_arg1 = "message"; 907 hook_arg2 = ""; 908 } 909 910 s->fp = fopen_for_writing(git_path_commit_editmsg()); 911 if (!s->fp) 912 die_errno(_("could not open '%s'"), git_path_commit_editmsg()); 913 914 /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */ 915 old_display_comment_prefix = s->display_comment_prefix; 916 s->display_comment_prefix = 1; 917 918 /* 919 * Most hints are counter-productive when the commit has 920 * already started. 921 */ 922 s->hints = 0; 923 924 if (clean_message_contents) 925 strbuf_stripspace(&sb, NULL); 926 927 if (signoff) 928 append_signoff(&sb, ignored_log_message_bytes(sb.buf, sb.len), 0); 929 930 if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len) 931 die_errno(_("could not write commit template")); 932 933#ifndef WITH_BREAKING_CHANGES 934 if (auto_comment_line_char) 935 adjust_comment_line_char(&sb); 936#endif /* !WITH_BREAKING_CHANGES */ 937 strbuf_release(&sb); 938 939 /* This checks if committer ident is explicitly given */ 940 strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT)); 941 if (use_editor && include_status) { 942 int ident_shown = 0; 943 enum git_colorbool saved_color_setting; 944 struct ident_split ci, ai; 945 const char *hint_cleanup_all = allow_empty_message ? 946 _("Please enter the commit message for your changes." 947 " Lines starting\nwith '%s' will be ignored.\n") : 948 _("Please enter the commit message for your changes." 949 " Lines starting\nwith '%s' will be ignored, and an empty" 950 " message aborts the commit.\n"); 951 const char *hint_cleanup_space = allow_empty_message ? 952 _("Please enter the commit message for your changes." 953 " Lines starting\n" 954 "with '%s' will be kept; you may remove them" 955 " yourself if you want to.\n") : 956 _("Please enter the commit message for your changes." 957 " Lines starting\n" 958 "with '%s' will be kept; you may remove them" 959 " yourself if you want to.\n" 960 "An empty message aborts the commit.\n"); 961 if (whence != FROM_COMMIT) { 962 if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) 963 wt_status_add_cut_line(s); 964 status_printf_ln( 965 s, GIT_COLOR_NORMAL, 966 whence == FROM_MERGE ? 967 _("\n" 968 "It looks like you may be committing a merge.\n" 969 "If this is not correct, please run\n" 970 " git update-ref -d MERGE_HEAD\n" 971 "and try again.\n") : 972 _("\n" 973 "It looks like you may be committing a cherry-pick.\n" 974 "If this is not correct, please run\n" 975 " git update-ref -d CHERRY_PICK_HEAD\n" 976 "and try again.\n")); 977 } 978 979 fprintf(s->fp, "\n"); 980 if (cleanup_mode == COMMIT_MSG_CLEANUP_ALL) 981 status_printf(s, GIT_COLOR_NORMAL, hint_cleanup_all, comment_line_str); 982 else if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) { 983 if (whence == FROM_COMMIT) 984 wt_status_add_cut_line(s); 985 } else /* COMMIT_MSG_CLEANUP_SPACE, that is. */ 986 status_printf(s, GIT_COLOR_NORMAL, hint_cleanup_space, comment_line_str); 987 988 /* 989 * These should never fail because they come from our own 990 * fmt_ident. They may fail the sane_ident test, but we know 991 * that the name and mail pointers will at least be valid, 992 * which is enough for our tests and printing here. 993 */ 994 assert_split_ident(&ai, author_ident); 995 assert_split_ident(&ci, &committer_ident); 996 997 if (ident_cmp(&ai, &ci)) 998 status_printf_ln(s, GIT_COLOR_NORMAL, 999 _("%s" 1000 "Author: %.*s <%.*s>"), 1001 ident_shown++ ? "" : "\n", 1002 (int)(ai.name_end - ai.name_begin), ai.name_begin, 1003 (int)(ai.mail_end - ai.mail_begin), ai.mail_begin); 1004 1005 if (author_date_is_interesting()) 1006 status_printf_ln(s, GIT_COLOR_NORMAL, 1007 _("%s" 1008 "Date: %s"), 1009 ident_shown++ ? "" : "\n", 1010 show_ident_date(&ai, DATE_MODE(NORMAL))); 1011 1012 if (!committer_ident_sufficiently_given()) 1013 status_printf_ln(s, GIT_COLOR_NORMAL, 1014 _("%s" 1015 "Committer: %.*s <%.*s>"), 1016 ident_shown++ ? "" : "\n", 1017 (int)(ci.name_end - ci.name_begin), ci.name_begin, 1018 (int)(ci.mail_end - ci.mail_begin), ci.mail_begin); 1019 1020 status_printf_ln(s, GIT_COLOR_NORMAL, "%s", ""); /* Add new line for clarity */ 1021 1022 saved_color_setting = s->use_color; 1023 s->use_color = GIT_COLOR_NEVER; 1024 committable = run_status(s->fp, index_file, prefix, 1, s); 1025 s->use_color = saved_color_setting; 1026 string_list_clear_func(&s->change, change_data_free); 1027 } else { 1028 struct object_id oid; 1029 const char *parent = "HEAD"; 1030 1031 if (!the_repository->index->initialized && repo_read_index(the_repository) < 0) 1032 die(_("Cannot read index")); 1033 1034 if (amend) 1035 parent = "HEAD^1"; 1036 1037 if (repo_get_oid(the_repository, parent, &oid)) { 1038 int i, ita_nr = 0; 1039 1040 /* TODO: audit for interaction with sparse-index. */ 1041 ensure_full_index(the_repository->index); 1042 for (i = 0; i < the_repository->index->cache_nr; i++) 1043 if (ce_intent_to_add(the_repository->index->cache[i])) 1044 ita_nr++; 1045 committable = the_repository->index->cache_nr > ita_nr; 1046 } else { 1047 /* 1048 * Unless the user did explicitly request a submodule 1049 * ignore mode by passing a command line option we do 1050 * not ignore any changed submodule SHA-1s when 1051 * comparing index and parent, no matter what is 1052 * configured. Otherwise we won't commit any 1053 * submodules which were manually staged, which would 1054 * be really confusing. 1055 */ 1056 struct diff_flags flags = DIFF_FLAGS_INIT; 1057 flags.override_submodule_config = 1; 1058 if (ignore_submodule_arg && 1059 !strcmp(ignore_submodule_arg, "all")) 1060 flags.ignore_submodules = 1; 1061 committable = index_differs_from(the_repository, 1062 parent, &flags, 1); 1063 } 1064 } 1065 strbuf_release(&committer_ident); 1066 1067 fclose(s->fp); 1068 1069 if (trailer_args.nr) { 1070 if (amend_file_with_trailers(git_path_commit_editmsg(), &trailer_args)) 1071 die(_("unable to pass trailers to --trailers")); 1072 strvec_clear(&trailer_args); 1073 } 1074 1075 /* 1076 * Reject an attempt to record a non-merge empty commit without 1077 * explicit --allow-empty. In the cherry-pick case, it may be 1078 * empty due to conflict resolution, which the user should okay. 1079 */ 1080 if (!committable && whence != FROM_MERGE && !allow_empty && 1081 !(amend && is_a_merge(current_head))) { 1082 s->hints = advice_enabled(ADVICE_STATUS_HINTS); 1083 s->display_comment_prefix = old_display_comment_prefix; 1084 run_status(stdout, index_file, prefix, 0, s); 1085 if (amend) 1086 fputs(_(empty_amend_advice), stderr); 1087 else if (is_from_cherry_pick(whence) || 1088 whence == FROM_REBASE_PICK) { 1089 fputs(_(empty_cherry_pick_advice), stderr); 1090 if (whence == FROM_CHERRY_PICK_SINGLE) 1091 fputs(_(empty_cherry_pick_advice_single), stderr); 1092 else if (whence == FROM_CHERRY_PICK_MULTI) 1093 fputs(_(empty_cherry_pick_advice_multi), stderr); 1094 else 1095 fputs(_(empty_rebase_pick_advice), stderr); 1096 } 1097 return 0; 1098 } 1099 1100 if (!no_verify && invoked_hook) { 1101 /* 1102 * Re-read the index as the pre-commit-commit hook was invoked 1103 * and could have updated it. We must do this before we invoke 1104 * the editor and after we invoke run_status above. 1105 */ 1106 discard_index(the_repository->index); 1107 } 1108 read_index_from(the_repository->index, index_file, repo_get_git_dir(the_repository)); 1109 1110 if (cache_tree_update(the_repository->index, 0)) { 1111 error(_("Error building trees")); 1112 return 0; 1113 } 1114 1115 if (run_commit_hook(use_editor, index_file, NULL, "prepare-commit-msg", 1116 git_path_commit_editmsg(), hook_arg1, hook_arg2, NULL)) 1117 return 0; 1118 1119 if (use_editor) { 1120 struct strvec env = STRVEC_INIT; 1121 1122 strvec_pushf(&env, "GIT_INDEX_FILE=%s", index_file); 1123 if (launch_editor(git_path_commit_editmsg(), NULL, env.v)) { 1124 fprintf(stderr, 1125 _("Please supply the message using either -m or -F option.\n")); 1126 exit(1); 1127 } 1128 strvec_clear(&env); 1129 } 1130 1131 if (!no_verify && 1132 run_commit_hook(use_editor, index_file, NULL, "commit-msg", 1133 git_path_commit_editmsg(), NULL)) { 1134 return 0; 1135 } 1136 1137 return 1; 1138} 1139 1140static const char *find_author_by_nickname(const char *name) 1141{ 1142 struct rev_info revs; 1143 struct commit *commit; 1144 struct strbuf buf = STRBUF_INIT; 1145 const char *av[20]; 1146 int ac = 0; 1147 1148 repo_init_revisions(the_repository, &revs, NULL); 1149 strbuf_addf(&buf, "--author=%s", name); 1150 av[++ac] = "--all"; 1151 av[++ac] = "-i"; 1152 av[++ac] = buf.buf; 1153 av[++ac] = NULL; 1154 setup_revisions(ac, av, &revs, NULL); 1155 revs.mailmap = xmalloc(sizeof(struct string_list)); 1156 string_list_init_nodup(revs.mailmap); 1157 read_mailmap(revs.mailmap); 1158 1159 if (prepare_revision_walk(&revs)) 1160 die(_("revision walk setup failed")); 1161 commit = get_revision(&revs); 1162 if (commit) { 1163 struct pretty_print_context ctx = {0}; 1164 ctx.date_mode.type = DATE_NORMAL; 1165 strbuf_release(&buf); 1166 repo_format_commit_message(the_repository, commit, 1167 "%aN <%aE>", &buf, &ctx); 1168 release_revisions(&revs); 1169 return strbuf_detach(&buf, NULL); 1170 } 1171 die(_("--author '%s' is not 'Name <email>' and matches no existing author"), name); 1172} 1173 1174static void handle_ignored_arg(struct wt_status *s) 1175{ 1176 if (!ignored_arg) 1177 ; /* default already initialized */ 1178 else if (!strcmp(ignored_arg, "traditional")) 1179 s->show_ignored_mode = SHOW_TRADITIONAL_IGNORED; 1180 else if (!strcmp(ignored_arg, "no")) 1181 s->show_ignored_mode = SHOW_NO_IGNORED; 1182 else if (!strcmp(ignored_arg, "matching")) 1183 s->show_ignored_mode = SHOW_MATCHING_IGNORED; 1184 else 1185 die(_("Invalid ignored mode '%s'"), ignored_arg); 1186} 1187 1188static enum untracked_status_type parse_untracked_setting_name(const char *u) 1189{ 1190 /* 1191 * Please update $__git_untracked_file_modes in 1192 * git-completion.bash when you add new options 1193 */ 1194 switch (git_parse_maybe_bool(u)) { 1195 case 0: 1196 u = "no"; 1197 break; 1198 case 1: 1199 u = "normal"; 1200 break; 1201 default: 1202 break; 1203 } 1204 1205 if (!strcmp(u, "no")) 1206 return SHOW_NO_UNTRACKED_FILES; 1207 else if (!strcmp(u, "normal")) 1208 return SHOW_NORMAL_UNTRACKED_FILES; 1209 else if (!strcmp(u, "all")) 1210 return SHOW_ALL_UNTRACKED_FILES; 1211 else 1212 return SHOW_UNTRACKED_FILES_ERROR; 1213} 1214 1215static void handle_untracked_files_arg(struct wt_status *s) 1216{ 1217 enum untracked_status_type u; 1218 1219 if (!untracked_files_arg) 1220 return; /* default already initialized */ 1221 1222 u = parse_untracked_setting_name(untracked_files_arg); 1223 if (u == SHOW_UNTRACKED_FILES_ERROR) 1224 die(_("Invalid untracked files mode '%s'"), 1225 untracked_files_arg); 1226 s->show_untracked_files = u; 1227} 1228 1229static const char *read_commit_message(const char *name) 1230{ 1231 const char *out_enc; 1232 struct commit *commit; 1233 1234 commit = lookup_commit_reference_by_name(name); 1235 if (!commit) 1236 die(_("could not lookup commit '%s'"), name); 1237 out_enc = get_commit_output_encoding(); 1238 return repo_logmsg_reencode(the_repository, commit, NULL, out_enc); 1239} 1240 1241/* 1242 * Enumerate what needs to be propagated when --porcelain 1243 * is not in effect here. 1244 */ 1245static struct status_deferred_config { 1246 enum wt_status_format status_format; 1247 int show_branch; 1248 enum ahead_behind_flags ahead_behind; 1249} status_deferred_config = { 1250 STATUS_FORMAT_UNSPECIFIED, 1251 -1, /* unspecified */ 1252 AHEAD_BEHIND_UNSPECIFIED, 1253}; 1254 1255static void finalize_deferred_config(struct wt_status *s) 1256{ 1257 int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN && 1258 status_format != STATUS_FORMAT_PORCELAIN_V2 && 1259 !s->null_termination); 1260 1261 if (s->null_termination) { 1262 if (status_format == STATUS_FORMAT_NONE || 1263 status_format == STATUS_FORMAT_UNSPECIFIED) 1264 status_format = STATUS_FORMAT_PORCELAIN; 1265 else if (status_format == STATUS_FORMAT_LONG) 1266 die(_("options '%s' and '%s' cannot be used together"), "--long", "-z"); 1267 } 1268 1269 if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED) 1270 status_format = status_deferred_config.status_format; 1271 if (status_format == STATUS_FORMAT_UNSPECIFIED) 1272 status_format = STATUS_FORMAT_NONE; 1273 1274 if (use_deferred_config && s->show_branch < 0) 1275 s->show_branch = status_deferred_config.show_branch; 1276 if (s->show_branch < 0) 1277 s->show_branch = 0; 1278 1279 /* 1280 * If the user did not give a "--[no]-ahead-behind" command 1281 * line argument *AND* we will print in a human-readable format 1282 * (short, long etc.) then we inherit from the status.aheadbehind 1283 * config setting. In all other cases (and porcelain V[12] formats 1284 * in particular), we inherit _FULL for backwards compatibility. 1285 */ 1286 if (use_deferred_config && 1287 s->ahead_behind_flags == AHEAD_BEHIND_UNSPECIFIED) 1288 s->ahead_behind_flags = status_deferred_config.ahead_behind; 1289 1290 if (s->ahead_behind_flags == AHEAD_BEHIND_UNSPECIFIED) 1291 s->ahead_behind_flags = AHEAD_BEHIND_FULL; 1292} 1293 1294static void check_fixup_reword_options(int argc, const char *argv[]) { 1295 if (whence != FROM_COMMIT) { 1296 if (whence == FROM_MERGE) 1297 die(_("You are in the middle of a merge -- cannot reword.")); 1298 else if (is_from_cherry_pick(whence)) 1299 die(_("You are in the middle of a cherry-pick -- cannot reword.")); 1300 } 1301 if (argc) 1302 die(_("reword option of '%s' and path '%s' cannot be used together"), "--fixup", *argv); 1303 if (patch_interactive || interactive || all || also || only) 1304 die(_("reword option of '%s' and '%s' cannot be used together"), 1305 "--fixup", "--patch/--interactive/--all/--include/--only"); 1306} 1307 1308static int parse_and_validate_options(int argc, const char *argv[], 1309 const struct option *options, 1310 const char * const usage[], 1311 const char *prefix, 1312 struct commit *current_head, 1313 struct wt_status *s) 1314{ 1315 argc = parse_options(argc, argv, prefix, options, usage, 0); 1316 finalize_deferred_config(s); 1317 1318 if (force_author && !strchr(force_author, '>')) 1319 force_author = find_author_by_nickname(force_author); 1320 1321 if (force_author && renew_authorship) 1322 die(_("options '%s' and '%s' cannot be used together"), "--reset-author", "--author"); 1323 1324 if (logfile || have_option_m || use_message) 1325 use_editor = 0; 1326 1327 /* Sanity check options */ 1328 if (amend && !current_head) 1329 die(_("You have nothing to amend.")); 1330 if (amend && whence != FROM_COMMIT) { 1331 if (whence == FROM_MERGE) 1332 die(_("You are in the middle of a merge -- cannot amend.")); 1333 else if (is_from_cherry_pick(whence)) 1334 die(_("You are in the middle of a cherry-pick -- cannot amend.")); 1335 else if (whence == FROM_REBASE_PICK) 1336 die(_("You are in the middle of a rebase -- cannot amend.")); 1337 } 1338 if (fixup_message && squash_message) 1339 die(_("options '%s' and '%s' cannot be used together"), "--squash", "--fixup"); 1340 die_for_incompatible_opt4(!!use_message, "-C", 1341 !!edit_message, "-c", 1342 !!logfile, "-F", 1343 !!fixup_message, "--fixup"); 1344 die_for_incompatible_opt4(have_option_m, "-m", 1345 !!edit_message, "-c", 1346 !!use_message, "-C", 1347 !!logfile, "-F"); 1348 if (use_message || edit_message || logfile ||fixup_message || have_option_m) 1349 FREE_AND_NULL(template_file); 1350 if (edit_message) 1351 use_message = edit_message; 1352 if (amend && !use_message && !fixup_message) 1353 use_message = "HEAD"; 1354 if (!use_message && !is_from_cherry_pick(whence) && 1355 !is_from_rebase(whence) && renew_authorship) 1356 die(_("--reset-author can be used only with -C, -c or --amend.")); 1357 if (use_message) { 1358 use_message_buffer = read_commit_message(use_message); 1359 if (!renew_authorship) { 1360 author_message = use_message; 1361 author_message_buffer = use_message_buffer; 1362 } 1363 } 1364 if ((is_from_cherry_pick(whence) || whence == FROM_REBASE_PICK) && 1365 !renew_authorship) { 1366 author_message = "CHERRY_PICK_HEAD"; 1367 author_message_buffer = read_commit_message(author_message); 1368 } 1369 1370 if (patch_interactive) 1371 interactive = 1; 1372 1373 die_for_incompatible_opt4(also, "-i/--include", 1374 only, "-o/--only", 1375 all, "-a/--all", 1376 interactive, "--interactive/-p/--patch"); 1377 if (fixup_message) { 1378 /* 1379 * We limit --fixup's suboptions to only alpha characters. 1380 * If the first character after a run of alpha is colon, 1381 * then the part before the colon may be a known suboption 1382 * name like `amend` or `reword`, or a misspelt suboption 1383 * name. In either case, we treat it as 1384 * --fixup=<suboption>:<arg>. 1385 * 1386 * Otherwise, we are dealing with --fixup=<commit>. 1387 */ 1388 char *p = fixup_message; 1389 while (isalpha(*p)) 1390 p++; 1391 if (p > fixup_message && *p == ':') { 1392 *p = '\0'; 1393 fixup_commit = p + 1; 1394 if (!strcmp("amend", fixup_message) || 1395 !strcmp("reword", fixup_message)) { 1396 fixup_prefix = "amend"; 1397 allow_empty = 1; 1398 if (*fixup_message == 'r') { 1399 check_fixup_reword_options(argc, argv); 1400 only = 1; 1401 } 1402 } else { 1403 die(_("unknown option: --fixup=%s:%s"), fixup_message, fixup_commit); 1404 } 1405 } else { 1406 fixup_commit = fixup_message; 1407 fixup_prefix = "fixup"; 1408 use_editor = 0; 1409 } 1410 } 1411 1412 if (0 <= edit_flag) 1413 use_editor = edit_flag; 1414 1415 handle_untracked_files_arg(s); 1416 1417 if (all && argc > 0) 1418 die(_("paths '%s ...' with -a does not make sense"), 1419 argv[0]); 1420 1421 if (status_format != STATUS_FORMAT_NONE) 1422 dry_run = 1; 1423 1424 return argc; 1425} 1426 1427static int dry_run_commit(const char **argv, const char *prefix, 1428 const struct commit *current_head, struct wt_status *s) 1429{ 1430 int committable; 1431 const char *index_file; 1432 1433 index_file = prepare_index(argv, prefix, current_head, 1); 1434 committable = run_status(stdout, index_file, prefix, 0, s); 1435 rollback_index_files(); 1436 1437 return committable ? 0 : 1; 1438} 1439 1440define_list_config_array_extra(color_status_slots, {"added"}); 1441 1442static int parse_status_slot(const char *slot) 1443{ 1444 if (!strcasecmp(slot, "added")) 1445 return WT_STATUS_UPDATED; 1446 1447 return LOOKUP_CONFIG(color_status_slots, slot); 1448} 1449 1450static int git_status_config(const char *k, const char *v, 1451 const struct config_context *ctx, void *cb) 1452{ 1453 struct wt_status *s = cb; 1454 const char *slot_name; 1455 1456 if (starts_with(k, "column.")) 1457 return git_column_config(k, v, "status", &s->colopts); 1458 if (!strcmp(k, "status.submodulesummary")) { 1459 int is_bool; 1460 s->submodule_summary = git_config_bool_or_int(k, v, ctx->kvi, 1461 &is_bool); 1462 if (is_bool && s->submodule_summary) 1463 s->submodule_summary = -1; 1464 return 0; 1465 } 1466 if (!strcmp(k, "status.short")) { 1467 if (git_config_bool(k, v)) 1468 status_deferred_config.status_format = STATUS_FORMAT_SHORT; 1469 else 1470 status_deferred_config.status_format = STATUS_FORMAT_NONE; 1471 return 0; 1472 } 1473 if (!strcmp(k, "status.branch")) { 1474 status_deferred_config.show_branch = git_config_bool(k, v); 1475 return 0; 1476 } 1477 if (!strcmp(k, "status.aheadbehind")) { 1478 status_deferred_config.ahead_behind = git_config_bool(k, v); 1479 return 0; 1480 } 1481 if (!strcmp(k, "status.showstash")) { 1482 s->show_stash = git_config_bool(k, v); 1483 return 0; 1484 } 1485 if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) { 1486 s->use_color = git_config_colorbool(k, v); 1487 return 0; 1488 } 1489 if (!strcmp(k, "status.displaycommentprefix")) { 1490 s->display_comment_prefix = git_config_bool(k, v); 1491 return 0; 1492 } 1493 if (skip_prefix(k, "status.color.", &slot_name) || 1494 skip_prefix(k, "color.status.", &slot_name)) { 1495 int slot = parse_status_slot(slot_name); 1496 if (slot < 0) 1497 return 0; 1498 if (!v) 1499 return config_error_nonbool(k); 1500 return color_parse(v, s->color_palette[slot]); 1501 } 1502 if (!strcmp(k, "status.relativepaths")) { 1503 s->relative_paths = git_config_bool(k, v); 1504 return 0; 1505 } 1506 if (!strcmp(k, "status.showuntrackedfiles")) { 1507 enum untracked_status_type u; 1508 1509 u = parse_untracked_setting_name(v); 1510 if (u == SHOW_UNTRACKED_FILES_ERROR) 1511 return error(_("Invalid untracked files mode '%s'"), v); 1512 s->show_untracked_files = u; 1513 return 0; 1514 } 1515 if (!strcmp(k, "diff.renamelimit")) { 1516 if (s->rename_limit == -1) 1517 s->rename_limit = git_config_int(k, v, ctx->kvi); 1518 return 0; 1519 } 1520 if (!strcmp(k, "status.renamelimit")) { 1521 s->rename_limit = git_config_int(k, v, ctx->kvi); 1522 return 0; 1523 } 1524 if (!strcmp(k, "diff.renames")) { 1525 if (s->detect_rename == -1) 1526 s->detect_rename = git_config_rename(k, v); 1527 return 0; 1528 } 1529 if (!strcmp(k, "status.renames")) { 1530 s->detect_rename = git_config_rename(k, v); 1531 return 0; 1532 } 1533 return git_diff_ui_config(k, v, ctx, NULL); 1534} 1535 1536int cmd_status(int argc, 1537const char **argv, 1538const char *prefix, 1539struct repository *repo UNUSED) 1540{ 1541 static int no_renames = -1; 1542 static const char *rename_score_arg = (const char *)-1; 1543 static struct wt_status s; 1544 unsigned int progress_flag = 0; 1545 int fd; 1546 struct object_id oid; 1547 static struct option builtin_status_options[] = { 1548 OPT__VERBOSE(&verbose, N_("be verbose")), 1549 OPT_SET_INT('s', "short", &status_format, 1550 N_("show status concisely"), STATUS_FORMAT_SHORT), 1551 OPT_BOOL('b', "branch", &s.show_branch, 1552 N_("show branch information")), 1553 OPT_BOOL(0, "show-stash", &s.show_stash, 1554 N_("show stash information")), 1555 OPT_BOOL(0, "ahead-behind", &s.ahead_behind_flags, 1556 N_("compute full ahead/behind values")), 1557 OPT_CALLBACK_F(0, "porcelain", &status_format, 1558 N_("version"), N_("machine-readable output"), 1559 PARSE_OPT_OPTARG, opt_parse_porcelain), 1560 OPT_SET_INT(0, "long", &status_format, 1561 N_("show status in long format (default)"), 1562 STATUS_FORMAT_LONG), 1563 OPT_BOOL('z', "null", &s.null_termination, 1564 N_("terminate entries with NUL")), 1565 { 1566 .type = OPTION_STRING, 1567 .short_name = 'u', 1568 .long_name = "untracked-files", 1569 .value = &untracked_files_arg, 1570 .argh = N_("mode"), 1571 .help = N_("show untracked files, optional modes: all, normal, no. (Default: all)"), 1572 .flags = PARSE_OPT_OPTARG, 1573 .defval = (intptr_t)"all", 1574 }, 1575 { 1576 .type = OPTION_STRING, 1577 .long_name = "ignored", 1578 .value = &ignored_arg, 1579 .argh = N_("mode"), 1580 .help = N_("show ignored files, optional modes: traditional, matching, no. (Default: traditional)"), 1581 .flags = PARSE_OPT_OPTARG, 1582 .defval = (intptr_t)"traditional", 1583 }, 1584 { 1585 .type = OPTION_STRING, 1586 .long_name = "ignore-submodules", 1587 .value = &ignore_submodule_arg, 1588 .argh = N_("when"), 1589 .help = N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"), 1590 .flags = PARSE_OPT_OPTARG, 1591 .defval = (intptr_t)"all", 1592 }, 1593 OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")), 1594 OPT_BOOL(0, "no-renames", &no_renames, N_("do not detect renames")), 1595 OPT_CALLBACK_F('M', "find-renames", &rename_score_arg, 1596 N_("n"), N_("detect renames, optionally set similarity index"), 1597 PARSE_OPT_OPTARG | PARSE_OPT_NONEG, opt_parse_rename_score), 1598 OPT_END(), 1599 }; 1600 1601 show_usage_with_options_if_asked(argc, argv, 1602 builtin_status_usage, builtin_status_options); 1603 1604 prepare_repo_settings(the_repository); 1605 the_repository->settings.command_requires_full_index = 0; 1606 1607 status_init_config(&s, git_status_config); 1608 argc = parse_options(argc, argv, prefix, 1609 builtin_status_options, 1610 builtin_status_usage, 0); 1611 finalize_colopts(&s.colopts, -1); 1612 finalize_deferred_config(&s); 1613 1614 handle_untracked_files_arg(&s); 1615 handle_ignored_arg(&s); 1616 1617 if (s.show_ignored_mode == SHOW_MATCHING_IGNORED && 1618 s.show_untracked_files == SHOW_NO_UNTRACKED_FILES) 1619 die(_("Unsupported combination of ignored and untracked-files arguments")); 1620 1621 parse_pathspec(&s.pathspec, 0, 1622 PATHSPEC_PREFER_FULL, 1623 prefix, argv); 1624 1625 if (status_format != STATUS_FORMAT_PORCELAIN && 1626 status_format != STATUS_FORMAT_PORCELAIN_V2) 1627 progress_flag = REFRESH_PROGRESS; 1628 repo_read_index(the_repository); 1629 refresh_index(the_repository->index, 1630 REFRESH_QUIET|REFRESH_UNMERGED|progress_flag, 1631 &s.pathspec, NULL, NULL); 1632 1633 if (use_optional_locks()) 1634 fd = repo_hold_locked_index(the_repository, &index_lock, 0); 1635 else 1636 fd = -1; 1637 1638 s.is_initial = repo_get_oid(the_repository, s.reference, &oid) ? 1 : 0; 1639 if (!s.is_initial) 1640 oidcpy(&s.oid_commit, &oid); 1641 1642 s.ignore_submodule_arg = ignore_submodule_arg; 1643 s.status_format = status_format; 1644 s.verbose = verbose; 1645 if (no_renames != -1) 1646 s.detect_rename = !no_renames; 1647 if ((intptr_t)rename_score_arg != -1) { 1648 if (s.detect_rename < DIFF_DETECT_RENAME) 1649 s.detect_rename = DIFF_DETECT_RENAME; 1650 if (rename_score_arg) 1651 s.rename_score = parse_rename_score(&rename_score_arg); 1652 } 1653 1654 wt_status_collect(&s); 1655 1656 if (0 <= fd) 1657 repo_update_index_if_able(the_repository, &index_lock); 1658 1659 if (s.relative_paths) 1660 s.prefix = prefix; 1661 1662 wt_status_print(&s); 1663 wt_status_collect_free_buffers(&s); 1664 1665 return 0; 1666} 1667 1668static int git_commit_config(const char *k, const char *v, 1669 const struct config_context *ctx, void *cb) 1670{ 1671 struct wt_status *s = cb; 1672 1673 if (!strcmp(k, "commit.template")) 1674 return git_config_pathname(&template_file, k, v); 1675 if (!strcmp(k, "commit.status")) { 1676 include_status = git_config_bool(k, v); 1677 return 0; 1678 } 1679 if (!strcmp(k, "commit.cleanup")) { 1680 FREE_AND_NULL(cleanup_config); 1681 return git_config_string(&cleanup_config, k, v); 1682 } 1683 if (!strcmp(k, "commit.gpgsign")) { 1684 sign_commit = git_config_bool(k, v) ? "" : NULL; 1685 return 0; 1686 } 1687 if (!strcmp(k, "commit.verbose")) { 1688 int is_bool; 1689 config_commit_verbose = git_config_bool_or_int(k, v, ctx->kvi, 1690 &is_bool); 1691 return 0; 1692 } 1693 1694 return git_status_config(k, v, ctx, s); 1695} 1696 1697int cmd_commit(int argc, 1698 const char **argv, 1699 const char *prefix, 1700 struct repository *repo UNUSED) 1701{ 1702 static struct wt_status s; 1703 static const char *cleanup_arg = NULL; 1704 static struct option builtin_commit_options[] = { 1705 OPT__QUIET(&quiet, N_("suppress summary after successful commit")), 1706 OPT__VERBOSE(&verbose, N_("show diff in commit message template")), 1707 1708 OPT_GROUP(N_("Commit message options")), 1709 OPT_FILENAME('F', "file", &logfile, N_("read message from file")), 1710 OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")), 1711 OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")), 1712 OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m), 1713 OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")), 1714 OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")), 1715 /* 1716 * TRANSLATORS: Leave "[(amend|reword):]" as-is, 1717 * and only translate <commit>. 1718 */ 1719 OPT_STRING(0, "fixup", &fixup_message, N_("[(amend|reword):]commit"), N_("use autosquash formatted message to fixup or amend/reword specified commit")), 1720 OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")), 1721 OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")), 1722 OPT_PASSTHRU_ARGV(0, "trailer", &trailer_args, N_("trailer"), N_("add custom trailer(s)"), PARSE_OPT_NONEG), 1723 OPT_BOOL('s', "signoff", &signoff, N_("add a Signed-off-by trailer")), 1724 OPT_FILENAME('t', "template", &template_file, N_("use specified template file")), 1725 OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")), 1726 OPT_CLEANUP(&cleanup_arg), 1727 OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")), 1728 { 1729 .type = OPTION_STRING, 1730 .short_name = 'S', 1731 .long_name = "gpg-sign", 1732 .value = &sign_commit, 1733 .argh = N_("key-id"), 1734 .help = N_("GPG sign commit"), 1735 .flags = PARSE_OPT_OPTARG, 1736 .defval = (intptr_t) "", 1737 }, 1738 /* end commit message options */ 1739 1740 OPT_GROUP(N_("Commit contents options")), 1741 OPT_BOOL('a', "all", &all, N_("commit all changed files")), 1742 OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")), 1743 OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")), 1744 OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")), 1745 OPT_DIFF_UNIFIED(&add_p_opt.context), 1746 OPT_DIFF_INTERHUNK_CONTEXT(&add_p_opt.interhunkcontext), 1747 OPT_BOOL('o', "only", &only, N_("commit only specified files")), 1748 OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit and commit-msg hooks")), 1749 OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")), 1750 OPT_SET_INT(0, "short", &status_format, N_("show status concisely"), 1751 STATUS_FORMAT_SHORT), 1752 OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")), 1753 OPT_BOOL(0, "ahead-behind", &s.ahead_behind_flags, 1754 N_("compute full ahead/behind values")), 1755 OPT_SET_INT(0, "porcelain", &status_format, 1756 N_("machine-readable output"), STATUS_FORMAT_PORCELAIN), 1757 OPT_SET_INT(0, "long", &status_format, 1758 N_("show status in long format (default)"), 1759 STATUS_FORMAT_LONG), 1760 OPT_BOOL('z', "null", &s.null_termination, 1761 N_("terminate entries with NUL")), 1762 OPT_BOOL(0, "amend", &amend, N_("amend previous commit")), 1763 OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")), 1764 { 1765 .type = OPTION_STRING, 1766 .short_name = 'u', 1767 .long_name = "untracked-files", 1768 .value = &untracked_files_arg, 1769 .argh = N_("mode"), 1770 .help = N_("show untracked files, optional modes: all, normal, no. (Default: all)"), 1771 .flags = PARSE_OPT_OPTARG, 1772 .defval = (intptr_t)"all", 1773 }, 1774 OPT_PATHSPEC_FROM_FILE(&pathspec_from_file), 1775 OPT_PATHSPEC_FILE_NUL(&pathspec_file_nul), 1776 /* end commit contents options */ 1777 1778 OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty, 1779 N_("ok to record an empty change")), 1780 OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message, 1781 N_("ok to record a change with an empty message")), 1782 1783 OPT_END() 1784 }; 1785 1786 struct strbuf sb = STRBUF_INIT; 1787 struct strbuf author_ident = STRBUF_INIT; 1788 const char *index_file, *reflog_msg; 1789 struct object_id oid; 1790 struct commit_list *parents = NULL; 1791 struct stat statbuf; 1792 struct commit *current_head = NULL; 1793 struct commit_extra_header *extra = NULL; 1794 struct strbuf err = STRBUF_INIT; 1795 int ret = 0; 1796 1797 show_usage_with_options_if_asked(argc, argv, 1798 builtin_commit_usage, builtin_commit_options); 1799 1800#ifndef WITH_BREAKING_CHANGES 1801 warn_on_auto_comment_char = true; 1802#endif /* !WITH_BREAKING_CHANGES */ 1803 prepare_repo_settings(the_repository); 1804 the_repository->settings.command_requires_full_index = 0; 1805 1806 status_init_config(&s, git_commit_config); 1807 s.commit_template = 1; 1808 status_format = STATUS_FORMAT_NONE; /* Ignore status.short */ 1809 s.colopts = 0; 1810 1811 if (repo_get_oid(the_repository, "HEAD", &oid)) 1812 current_head = NULL; 1813 else { 1814 current_head = lookup_commit_or_die(&oid, "HEAD"); 1815 if (repo_parse_commit(the_repository, current_head)) 1816 die(_("could not parse HEAD commit")); 1817 } 1818 verbose = -1; /* unspecified */ 1819 argc = parse_and_validate_options(argc, argv, builtin_commit_options, 1820 builtin_commit_usage, 1821 prefix, current_head, &s); 1822 if (verbose == -1) 1823 verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose; 1824 1825 if (cleanup_arg) { 1826 free(cleanup_config); 1827 cleanup_config = xstrdup(cleanup_arg); 1828 } 1829 cleanup_mode = get_cleanup_mode(cleanup_config, use_editor); 1830 1831 if (dry_run) 1832 return dry_run_commit(argv, prefix, current_head, &s); 1833 index_file = prepare_index(argv, prefix, current_head, 0); 1834 1835 /* Set up everything for writing the commit object. This includes 1836 running hooks, writing the trees, and interacting with the user. */ 1837 if (!prepare_to_commit(index_file, prefix, 1838 current_head, &s, &author_ident)) { 1839 ret = 1; 1840 rollback_index_files(); 1841 goto cleanup; 1842 } 1843 1844 /* Determine parents */ 1845 reflog_msg = getenv("GIT_REFLOG_ACTION"); 1846 if (!current_head) { 1847 if (!reflog_msg) 1848 reflog_msg = "commit (initial)"; 1849 } else if (amend) { 1850 if (!reflog_msg) 1851 reflog_msg = "commit (amend)"; 1852 parents = copy_commit_list(current_head->parents); 1853 } else if (whence == FROM_MERGE) { 1854 struct strbuf m = STRBUF_INIT; 1855 FILE *fp; 1856 int allow_fast_forward = 1; 1857 struct commit_list **pptr = &parents; 1858 1859 if (!reflog_msg) 1860 reflog_msg = "commit (merge)"; 1861 pptr = commit_list_append(current_head, pptr); 1862 fp = xfopen(git_path_merge_head(the_repository), "r"); 1863 while (strbuf_getline_lf(&m, fp) != EOF) { 1864 struct commit *parent; 1865 1866 parent = get_merge_parent(m.buf); 1867 if (!parent) 1868 die(_("Corrupt MERGE_HEAD file (%s)"), m.buf); 1869 pptr = commit_list_append(parent, pptr); 1870 } 1871 fclose(fp); 1872 strbuf_release(&m); 1873 if (!stat(git_path_merge_mode(the_repository), &statbuf)) { 1874 if (strbuf_read_file(&sb, git_path_merge_mode(the_repository), 0) < 0) 1875 die_errno(_("could not read MERGE_MODE")); 1876 if (!strcmp(sb.buf, "no-ff")) 1877 allow_fast_forward = 0; 1878 } 1879 if (allow_fast_forward) 1880 reduce_heads_replace(&parents); 1881 } else { 1882 if (!reflog_msg) 1883 reflog_msg = is_from_cherry_pick(whence) 1884 ? "commit (cherry-pick)" 1885 : is_from_rebase(whence) 1886 ? "commit (rebase)" 1887 : "commit"; 1888 commit_list_insert(current_head, &parents); 1889 } 1890 1891 /* Finally, get the commit message */ 1892 strbuf_reset(&sb); 1893 if (strbuf_read_file(&sb, git_path_commit_editmsg(), 0) < 0) { 1894 int saved_errno = errno; 1895 rollback_index_files(); 1896 die(_("could not read commit message: %s"), strerror(saved_errno)); 1897 } 1898 1899 cleanup_message(&sb, cleanup_mode, verbose); 1900 1901 if (message_is_empty(&sb, cleanup_mode) && !allow_empty_message) { 1902 rollback_index_files(); 1903 fprintf(stderr, _("Aborting commit due to empty commit message.\n")); 1904 exit(1); 1905 } 1906 if (template_untouched(&sb, template_file, cleanup_mode) && !allow_empty_message) { 1907 rollback_index_files(); 1908 fprintf(stderr, _("Aborting commit; you did not edit the message.\n")); 1909 exit(1); 1910 } 1911 1912 if (fixup_message && starts_with(sb.buf, "amend! ") && 1913 !allow_empty_message) { 1914 struct strbuf body = STRBUF_INIT; 1915 size_t len = commit_subject_length(sb.buf); 1916 strbuf_addstr(&body, sb.buf + len); 1917 if (message_is_empty(&body, cleanup_mode)) { 1918 rollback_index_files(); 1919 fprintf(stderr, _("Aborting commit due to empty commit message body.\n")); 1920 exit(1); 1921 } 1922 strbuf_release(&body); 1923 } 1924 1925 if (amend) { 1926 const char *exclude_gpgsig[3] = { "gpgsig", "gpgsig-sha256", NULL }; 1927 extra = read_commit_extra_headers(current_head, exclude_gpgsig); 1928 } else { 1929 struct commit_extra_header **tail = &extra; 1930 append_merge_tag_headers(parents, &tail); 1931 } 1932 1933 if (commit_tree_extended(sb.buf, sb.len, &the_repository->index->cache_tree->oid, 1934 parents, &oid, author_ident.buf, NULL, 1935 sign_commit, extra)) { 1936 rollback_index_files(); 1937 die(_("failed to write commit object")); 1938 } 1939 1940 if (update_head_with_reflog(current_head, &oid, reflog_msg, &sb, 1941 &err)) { 1942 rollback_index_files(); 1943 die("%s", err.buf); 1944 } 1945 1946 sequencer_post_commit_cleanup(the_repository, 0); 1947 unlink(git_path_merge_head(the_repository)); 1948 unlink(git_path_merge_msg(the_repository)); 1949 unlink(git_path_merge_mode(the_repository)); 1950 unlink(git_path_squash_msg(the_repository)); 1951 1952 if (commit_index_files()) 1953 die(_("repository has been updated, but unable to write\n" 1954 "new index file. Check that disk is not full and quota is\n" 1955 "not exceeded, and then \"git restore --staged :/\" to recover.")); 1956 1957 git_test_write_commit_graph_or_die(the_repository->objects->sources); 1958 1959 repo_rerere(the_repository, 0); 1960 run_auto_maintenance(quiet); 1961 run_commit_hook(use_editor, repo_get_index_file(the_repository), 1962 NULL, "post-commit", NULL); 1963 if (amend && !no_post_rewrite) { 1964 commit_post_rewrite(the_repository, current_head, &oid); 1965 } 1966 if (!quiet) { 1967 unsigned int flags = 0; 1968 1969 if (!current_head) 1970 flags |= SUMMARY_INITIAL_COMMIT; 1971 if (author_date_is_interesting()) 1972 flags |= SUMMARY_SHOW_AUTHOR_DATE; 1973 print_commit_summary(the_repository, prefix, 1974 &oid, flags); 1975 } 1976 1977 apply_autostash_ref(the_repository, "MERGE_AUTOSTASH"); 1978 1979cleanup: 1980 free_commit_extra_headers(extra); 1981 free_commit_list(parents); 1982 strbuf_release(&author_ident); 1983 strbuf_release(&err); 1984 strbuf_release(&sb); 1985 free(logfile); 1986 free(template_file); 1987 return ret; 1988}