builtin / commit.con commit commit-template: distinguish status information unconditionally (b3cf1b7)
   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#include "cache.h"
   9#include "lockfile.h"
  10#include "cache-tree.h"
  11#include "color.h"
  12#include "dir.h"
  13#include "builtin.h"
  14#include "diff.h"
  15#include "diffcore.h"
  16#include "commit.h"
  17#include "revision.h"
  18#include "wt-status.h"
  19#include "run-command.h"
  20#include "refs.h"
  21#include "log-tree.h"
  22#include "strbuf.h"
  23#include "utf8.h"
  24#include "parse-options.h"
  25#include "string-list.h"
  26#include "rerere.h"
  27#include "unpack-trees.h"
  28#include "quote.h"
  29#include "submodule.h"
  30#include "gpg-interface.h"
  31#include "column.h"
  32#include "sequencer.h"
  33#include "notes-utils.h"
  34#include "mailmap.h"
  35#include "sigchain.h"
  36
  37static const char * const builtin_commit_usage[] = {
  38        N_("git commit [<options>] [--] <pathspec>..."),
  39        NULL
  40};
  41
  42static const char * const builtin_status_usage[] = {
  43        N_("git status [<options>] [--] <pathspec>..."),
  44        NULL
  45};
  46
  47static const char implicit_ident_advice_noconfig[] =
  48N_("Your name and email address were configured automatically based\n"
  49"on your username and hostname. Please check that they are accurate.\n"
  50"You can suppress this message by setting them explicitly. Run the\n"
  51"following command and follow the instructions in your editor to edit\n"
  52"your configuration file:\n"
  53"\n"
  54"    git config --global --edit\n"
  55"\n"
  56"After doing this, you may fix the identity used for this commit with:\n"
  57"\n"
  58"    git commit --amend --reset-author\n");
  59
  60static const char implicit_ident_advice_config[] =
  61N_("Your name and email address were configured automatically based\n"
  62"on your username and hostname. Please check that they are accurate.\n"
  63"You can suppress this message by setting them explicitly:\n"
  64"\n"
  65"    git config --global user.name \"Your Name\"\n"
  66"    git config --global user.email you@example.com\n"
  67"\n"
  68"After doing this, you may fix the identity used for this commit with:\n"
  69"\n"
  70"    git commit --amend --reset-author\n");
  71
  72static const char empty_amend_advice[] =
  73N_("You asked to amend the most recent commit, but doing so would make\n"
  74"it empty. You can repeat your command with --allow-empty, or you can\n"
  75"remove the commit entirely with \"git reset HEAD^\".\n");
  76
  77static const char empty_cherry_pick_advice[] =
  78N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
  79"If you wish to commit it anyway, use:\n"
  80"\n"
  81"    git commit --allow-empty\n"
  82"\n");
  83
  84static const char empty_cherry_pick_advice_single[] =
  85N_("Otherwise, please use 'git reset'\n");
  86
  87static const char empty_cherry_pick_advice_multi[] =
  88N_("If you wish to skip this commit, use:\n"
  89"\n"
  90"    git reset\n"
  91"\n"
  92"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
  93"the remaining commits.\n");
  94
  95static GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
  96
  97static const char *use_message_buffer;
  98static struct lock_file index_lock; /* real index */
  99static struct lock_file false_lock; /* used only for partial commits */
 100static enum {
 101        COMMIT_AS_IS = 1,
 102        COMMIT_NORMAL,
 103        COMMIT_PARTIAL
 104} commit_style;
 105
 106static const char *logfile, *force_author;
 107static const char *template_file;
 108/*
 109 * The _message variables are commit names from which to take
 110 * the commit message and/or authorship.
 111 */
 112static const char *author_message, *author_message_buffer;
 113static char *edit_message, *use_message;
 114static char *fixup_message, *squash_message;
 115static int all, also, interactive, patch_interactive, only, amend, signoff;
 116static int edit_flag = -1; /* unspecified */
 117static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
 118static int config_commit_verbose = -1; /* unspecified */
 119static int no_post_rewrite, allow_empty_message;
 120static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
 121static char *sign_commit;
 122
 123/*
 124 * The default commit message cleanup mode will remove the lines
 125 * beginning with # (shell comments) and leading and trailing
 126 * whitespaces (empty lines or containing only whitespaces)
 127 * if editor is used, and only the whitespaces if the message
 128 * is specified explicitly.
 129 */
 130static enum {
 131        CLEANUP_SPACE,
 132        CLEANUP_NONE,
 133        CLEANUP_SCISSORS,
 134        CLEANUP_ALL
 135} cleanup_mode;
 136static const char *cleanup_arg;
 137
 138static enum commit_whence whence;
 139static int sequencer_in_use;
 140static int use_editor = 1, include_status = 1;
 141static int show_ignored_in_status, have_option_m;
 142static struct strbuf message = STRBUF_INIT;
 143
 144static enum wt_status_format status_format = STATUS_FORMAT_UNSPECIFIED;
 145
 146static int opt_parse_porcelain(const struct option *opt, const char *arg, int unset)
 147{
 148        enum wt_status_format *value = (enum wt_status_format *)opt->value;
 149        if (unset)
 150                *value = STATUS_FORMAT_NONE;
 151        else if (!arg)
 152                *value = STATUS_FORMAT_PORCELAIN;
 153        else if (!strcmp(arg, "v1") || !strcmp(arg, "1"))
 154                *value = STATUS_FORMAT_PORCELAIN;
 155        else if (!strcmp(arg, "v2") || !strcmp(arg, "2"))
 156                *value = STATUS_FORMAT_PORCELAIN_V2;
 157        else
 158                die("unsupported porcelain version '%s'", arg);
 159
 160        return 0;
 161}
 162
 163static int opt_parse_m(const struct option *opt, const char *arg, int unset)
 164{
 165        struct strbuf *buf = opt->value;
 166        if (unset) {
 167                have_option_m = 0;
 168                strbuf_setlen(buf, 0);
 169        } else {
 170                have_option_m = 1;
 171                if (buf->len)
 172                        strbuf_addch(buf, '\n');
 173                strbuf_addstr(buf, arg);
 174                strbuf_complete_line(buf);
 175        }
 176        return 0;
 177}
 178
 179static void determine_whence(struct wt_status *s)
 180{
 181        if (file_exists(git_path_merge_head()))
 182                whence = FROM_MERGE;
 183        else if (file_exists(git_path_cherry_pick_head())) {
 184                whence = FROM_CHERRY_PICK;
 185                if (file_exists(git_path_seq_dir()))
 186                        sequencer_in_use = 1;
 187        }
 188        else
 189                whence = FROM_COMMIT;
 190        if (s)
 191                s->whence = whence;
 192}
 193
 194static void status_init_config(struct wt_status *s, config_fn_t fn)
 195{
 196        wt_status_prepare(s);
 197        gitmodules_config();
 198        git_config(fn, s);
 199        determine_whence(s);
 200        init_diff_ui_defaults();
 201        s->hints = advice_status_hints; /* must come after git_config() */
 202}
 203
 204static 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
 219static int commit_index_files(void)
 220{
 221        int err = 0;
 222
 223        switch (commit_style) {
 224        case COMMIT_AS_IS:
 225                break; /* nothing to do */
 226        case COMMIT_NORMAL:
 227                err = commit_lock_file(&index_lock);
 228                break;
 229        case COMMIT_PARTIAL:
 230                err = commit_lock_file(&index_lock);
 231                rollback_lock_file(&false_lock);
 232                break;
 233        }
 234
 235        return err;
 236}
 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 */
 242static int list_paths(struct string_list *list, const char *with_tree,
 243                      const char *prefix, const struct pathspec *pattern)
 244{
 245        int i, ret;
 246        char *m;
 247
 248        if (!pattern->nr)
 249                return 0;
 250
 251        m = xcalloc(1, pattern->nr);
 252
 253        if (with_tree) {
 254                char *max_prefix = common_prefix(pattern);
 255                overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
 256                free(max_prefix);
 257        }
 258
 259        for (i = 0; i < active_nr; i++) {
 260                const struct cache_entry *ce = active_cache[i];
 261                struct string_list_item *item;
 262
 263                if (ce->ce_flags & CE_UPDATE)
 264                        continue;
 265                if (!ce_path_match(ce, pattern, m))
 266                        continue;
 267                item = string_list_insert(list, ce->name);
 268                if (ce_skip_worktree(ce))
 269                        item->util = item; /* better a valid pointer than a fake one */
 270        }
 271
 272        ret = report_path_error(m, pattern, prefix);
 273        free(m);
 274        return ret;
 275}
 276
 277static void add_remove_files(struct string_list *list)
 278{
 279        int i;
 280        for (i = 0; i < list->nr; i++) {
 281                struct stat st;
 282                struct string_list_item *p = &(list->items[i]);
 283
 284                /* p->util is skip-worktree */
 285                if (p->util)
 286                        continue;
 287
 288                if (!lstat(p->string, &st)) {
 289                        if (add_to_cache(p->string, &st, 0))
 290                                die(_("updating files failed"));
 291                } else
 292                        remove_file_from_cache(p->string);
 293        }
 294}
 295
 296static void create_base_index(const struct commit *current_head)
 297{
 298        struct tree *tree;
 299        struct unpack_trees_options opts;
 300        struct tree_desc t;
 301
 302        if (!current_head) {
 303                discard_cache();
 304                return;
 305        }
 306
 307        memset(&opts, 0, sizeof(opts));
 308        opts.head_idx = 1;
 309        opts.index_only = 1;
 310        opts.merge = 1;
 311        opts.src_index = &the_index;
 312        opts.dst_index = &the_index;
 313
 314        opts.fn = oneway_merge;
 315        tree = parse_tree_indirect(current_head->object.oid.hash);
 316        if (!tree)
 317                die(_("failed to unpack HEAD tree object"));
 318        parse_tree(tree);
 319        init_tree_desc(&t, tree->buffer, tree->size);
 320        if (unpack_trees(1, &t, &opts))
 321                exit(128); /* We've already reported the error, finish dying */
 322}
 323
 324static void refresh_cache_or_die(int refresh_flags)
 325{
 326        /*
 327         * refresh_flags contains REFRESH_QUIET, so the only errors
 328         * are for unmerged entries.
 329         */
 330        if (refresh_cache(refresh_flags | REFRESH_IN_PORCELAIN))
 331                die_resolve_conflict("commit");
 332}
 333
 334static const char *prepare_index(int argc, const char **argv, const char *prefix,
 335                                 const struct commit *current_head, int is_status)
 336{
 337        struct string_list partial;
 338        struct pathspec pathspec;
 339        int refresh_flags = REFRESH_QUIET;
 340        const char *ret;
 341
 342        if (is_status)
 343                refresh_flags |= REFRESH_UNMERGED;
 344        parse_pathspec(&pathspec, 0,
 345                       PATHSPEC_PREFER_FULL,
 346                       prefix, argv);
 347
 348        if (read_cache_preload(&pathspec) < 0)
 349                die(_("index file corrupt"));
 350
 351        if (interactive) {
 352                char *old_index_env = NULL;
 353                hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 354
 355                refresh_cache_or_die(refresh_flags);
 356
 357                if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
 358                        die(_("unable to create temporary index"));
 359
 360                old_index_env = getenv(INDEX_ENVIRONMENT);
 361                setenv(INDEX_ENVIRONMENT, get_lock_file_path(&index_lock), 1);
 362
 363                if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
 364                        die(_("interactive add failed"));
 365
 366                if (old_index_env && *old_index_env)
 367                        setenv(INDEX_ENVIRONMENT, old_index_env, 1);
 368                else
 369                        unsetenv(INDEX_ENVIRONMENT);
 370
 371                discard_cache();
 372                read_cache_from(get_lock_file_path(&index_lock));
 373                if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) {
 374                        if (reopen_lock_file(&index_lock) < 0)
 375                                die(_("unable to write index file"));
 376                        if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
 377                                die(_("unable to update temporary index"));
 378                } else
 379                        warning(_("Failed to update main cache tree"));
 380
 381                commit_style = COMMIT_NORMAL;
 382                return get_lock_file_path(&index_lock);
 383        }
 384
 385        /*
 386         * Non partial, non as-is commit.
 387         *
 388         * (1) get the real index;
 389         * (2) update the_index as necessary;
 390         * (3) write the_index out to the real index (still locked);
 391         * (4) return the name of the locked index file.
 392         *
 393         * The caller should run hooks on the locked real index, and
 394         * (A) if all goes well, commit the real index;
 395         * (B) on failure, rollback the real index.
 396         */
 397        if (all || (also && pathspec.nr)) {
 398                hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 399                add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
 400                refresh_cache_or_die(refresh_flags);
 401                update_main_cache_tree(WRITE_TREE_SILENT);
 402                if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
 403                        die(_("unable to write new_index file"));
 404                commit_style = COMMIT_NORMAL;
 405                return get_lock_file_path(&index_lock);
 406        }
 407
 408        /*
 409         * As-is commit.
 410         *
 411         * (1) return the name of the real index file.
 412         *
 413         * The caller should run hooks on the real index,
 414         * and create commit from the_index.
 415         * We still need to refresh the index here.
 416         */
 417        if (!only && !pathspec.nr) {
 418                hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 419                refresh_cache_or_die(refresh_flags);
 420                if (active_cache_changed
 421                    || !cache_tree_fully_valid(active_cache_tree))
 422                        update_main_cache_tree(WRITE_TREE_SILENT);
 423                if (active_cache_changed) {
 424                        if (write_locked_index(&the_index, &index_lock,
 425                                               COMMIT_LOCK))
 426                                die(_("unable to write new_index file"));
 427                } else {
 428                        rollback_lock_file(&index_lock);
 429                }
 430                commit_style = COMMIT_AS_IS;
 431                return get_index_file();
 432        }
 433
 434        /*
 435         * A partial commit.
 436         *
 437         * (0) find the set of affected paths;
 438         * (1) get lock on the real index file;
 439         * (2) update the_index with the given paths;
 440         * (3) write the_index out to the real index (still locked);
 441         * (4) get lock on the false index file;
 442         * (5) reset the_index from HEAD;
 443         * (6) update the_index the same way as (2);
 444         * (7) write the_index out to the false index file;
 445         * (8) return the name of the false index file (still locked);
 446         *
 447         * The caller should run hooks on the locked false index, and
 448         * create commit from it.  Then
 449         * (A) if all goes well, commit the real index;
 450         * (B) on failure, rollback the real index;
 451         * In either case, rollback the false index.
 452         */
 453        commit_style = COMMIT_PARTIAL;
 454
 455        if (whence != FROM_COMMIT) {
 456                if (whence == FROM_MERGE)
 457                        die(_("cannot do a partial commit during a merge."));
 458                else if (whence == FROM_CHERRY_PICK)
 459                        die(_("cannot do a partial commit during a cherry-pick."));
 460        }
 461
 462        string_list_init(&partial, 1);
 463        if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
 464                exit(1);
 465
 466        discard_cache();
 467        if (read_cache() < 0)
 468                die(_("cannot read the index"));
 469
 470        hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 471        add_remove_files(&partial);
 472        refresh_cache(REFRESH_QUIET);
 473        update_main_cache_tree(WRITE_TREE_SILENT);
 474        if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
 475                die(_("unable to write new_index file"));
 476
 477        hold_lock_file_for_update(&false_lock,
 478                                  git_path("next-index-%"PRIuMAX,
 479                                           (uintmax_t) getpid()),
 480                                  LOCK_DIE_ON_ERROR);
 481
 482        create_base_index(current_head);
 483        add_remove_files(&partial);
 484        refresh_cache(REFRESH_QUIET);
 485
 486        if (write_locked_index(&the_index, &false_lock, CLOSE_LOCK))
 487                die(_("unable to write temporary index file"));
 488
 489        discard_cache();
 490        ret = get_lock_file_path(&false_lock);
 491        read_cache_from(ret);
 492        return ret;
 493}
 494
 495static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
 496                      struct wt_status *s)
 497{
 498        struct object_id oid;
 499
 500        if (s->relative_paths)
 501                s->prefix = prefix;
 502
 503        if (amend) {
 504                s->amend = 1;
 505                s->reference = "HEAD^1";
 506        }
 507        s->verbose = verbose;
 508        s->index_file = index_file;
 509        s->fp = fp;
 510        s->nowarn = nowarn;
 511        s->is_initial = get_sha1(s->reference, oid.hash) ? 1 : 0;
 512        if (!s->is_initial)
 513                hashcpy(s->sha1_commit, oid.hash);
 514        s->status_format = status_format;
 515        s->ignore_submodule_arg = ignore_submodule_arg;
 516
 517        wt_status_collect(s);
 518        wt_status_print(s);
 519
 520        return s->commitable;
 521}
 522
 523static int is_a_merge(const struct commit *current_head)
 524{
 525        return !!(current_head->parents && current_head->parents->next);
 526}
 527
 528static void assert_split_ident(struct ident_split *id, const struct strbuf *buf)
 529{
 530        if (split_ident_line(id, buf->buf, buf->len) || !id->date_begin)
 531                die("BUG: unable to parse our own ident: %s", buf->buf);
 532}
 533
 534static void export_one(const char *var, const char *s, const char *e, int hack)
 535{
 536        struct strbuf buf = STRBUF_INIT;
 537        if (hack)
 538                strbuf_addch(&buf, hack);
 539        strbuf_addf(&buf, "%.*s", (int)(e - s), s);
 540        setenv(var, buf.buf, 1);
 541        strbuf_release(&buf);
 542}
 543
 544static int parse_force_date(const char *in, struct strbuf *out)
 545{
 546        strbuf_addch(out, '@');
 547
 548        if (parse_date(in, out) < 0) {
 549                int errors = 0;
 550                unsigned long t = approxidate_careful(in, &errors);
 551                if (errors)
 552                        return -1;
 553                strbuf_addf(out, "%lu", t);
 554        }
 555
 556        return 0;
 557}
 558
 559static void set_ident_var(char **buf, char *val)
 560{
 561        free(*buf);
 562        *buf = val;
 563}
 564
 565static void determine_author_info(struct strbuf *author_ident)
 566{
 567        char *name, *email, *date;
 568        struct ident_split author;
 569
 570        name = xstrdup_or_null(getenv("GIT_AUTHOR_NAME"));
 571        email = xstrdup_or_null(getenv("GIT_AUTHOR_EMAIL"));
 572        date = xstrdup_or_null(getenv("GIT_AUTHOR_DATE"));
 573
 574        if (author_message) {
 575                struct ident_split ident;
 576                size_t len;
 577                const char *a;
 578
 579                a = find_commit_header(author_message_buffer, "author", &len);
 580                if (!a)
 581                        die(_("commit '%s' lacks author header"), author_message);
 582                if (split_ident_line(&ident, a, len) < 0)
 583                        die(_("commit '%s' has malformed author line"), author_message);
 584
 585                set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
 586                set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
 587
 588                if (ident.date_begin) {
 589                        struct strbuf date_buf = STRBUF_INIT;
 590                        strbuf_addch(&date_buf, '@');
 591                        strbuf_add(&date_buf, ident.date_begin, ident.date_end - ident.date_begin);
 592                        strbuf_addch(&date_buf, ' ');
 593                        strbuf_add(&date_buf, ident.tz_begin, ident.tz_end - ident.tz_begin);
 594                        set_ident_var(&date, strbuf_detach(&date_buf, NULL));
 595                }
 596        }
 597
 598        if (force_author) {
 599                struct ident_split ident;
 600
 601                if (split_ident_line(&ident, force_author, strlen(force_author)) < 0)
 602                        die(_("malformed --author parameter"));
 603                set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
 604                set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
 605        }
 606
 607        if (force_date) {
 608                struct strbuf date_buf = STRBUF_INIT;
 609                if (parse_force_date(force_date, &date_buf))
 610                        die(_("invalid date format: %s"), force_date);
 611                set_ident_var(&date, strbuf_detach(&date_buf, NULL));
 612        }
 613
 614        strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
 615        assert_split_ident(&author, author_ident);
 616        export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
 617        export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
 618        export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
 619        free(name);
 620        free(email);
 621        free(date);
 622}
 623
 624static int author_date_is_interesting(void)
 625{
 626        return author_message || force_date;
 627}
 628
 629static void adjust_comment_line_char(const struct strbuf *sb)
 630{
 631        char candidates[] = "#;@!$%^&|:";
 632        char *candidate;
 633        const char *p;
 634
 635        comment_line_char = candidates[0];
 636        if (!memchr(sb->buf, comment_line_char, sb->len))
 637                return;
 638
 639        p = sb->buf;
 640        candidate = strchr(candidates, *p);
 641        if (candidate)
 642                *candidate = ' ';
 643        for (p = sb->buf; *p; p++) {
 644                if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
 645                        candidate = strchr(candidates, p[1]);
 646                        if (candidate)
 647                                *candidate = ' ';
 648                }
 649        }
 650
 651        for (p = candidates; *p == ' '; p++)
 652                ;
 653        if (!*p)
 654                die(_("unable to select a comment character that is not used\n"
 655                      "in the current commit message"));
 656        comment_line_char = *p;
 657}
 658
 659static int prepare_to_commit(const char *index_file, const char *prefix,
 660                             struct commit *current_head,
 661                             struct wt_status *s,
 662                             struct strbuf *author_ident)
 663{
 664        struct stat statbuf;
 665        struct strbuf committer_ident = STRBUF_INIT;
 666        int commitable;
 667        struct strbuf sb = STRBUF_INIT;
 668        const char *hook_arg1 = NULL;
 669        const char *hook_arg2 = NULL;
 670        int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
 671        int old_display_comment_prefix;
 672
 673        /* This checks and barfs if author is badly specified */
 674        determine_author_info(author_ident);
 675
 676        if (!no_verify && run_commit_hook(use_editor, index_file, "pre-commit", NULL))
 677                return 0;
 678
 679        if (squash_message) {
 680                /*
 681                 * Insert the proper subject line before other commit
 682                 * message options add their content.
 683                 */
 684                if (use_message && !strcmp(use_message, squash_message))
 685                        strbuf_addstr(&sb, "squash! ");
 686                else {
 687                        struct pretty_print_context ctx = {0};
 688                        struct commit *c;
 689                        c = lookup_commit_reference_by_name(squash_message);
 690                        if (!c)
 691                                die(_("could not lookup commit %s"), squash_message);
 692                        ctx.output_encoding = get_commit_output_encoding();
 693                        format_commit_message(c, "squash! %s\n\n", &sb,
 694                                              &ctx);
 695                }
 696        }
 697
 698        if (have_option_m) {
 699                strbuf_addbuf(&sb, &message);
 700                hook_arg1 = "message";
 701        } else if (logfile && !strcmp(logfile, "-")) {
 702                if (isatty(0))
 703                        fprintf(stderr, _("(reading log message from standard input)\n"));
 704                if (strbuf_read(&sb, 0, 0) < 0)
 705                        die_errno(_("could not read log from standard input"));
 706                hook_arg1 = "message";
 707        } else if (logfile) {
 708                if (strbuf_read_file(&sb, logfile, 0) < 0)
 709                        die_errno(_("could not read log file '%s'"),
 710                                  logfile);
 711                hook_arg1 = "message";
 712        } else if (use_message) {
 713                char *buffer;
 714                buffer = strstr(use_message_buffer, "\n\n");
 715                if (buffer)
 716                        strbuf_addstr(&sb, skip_blank_lines(buffer + 2));
 717                hook_arg1 = "commit";
 718                hook_arg2 = use_message;
 719        } else if (fixup_message) {
 720                struct pretty_print_context ctx = {0};
 721                struct commit *commit;
 722                commit = lookup_commit_reference_by_name(fixup_message);
 723                if (!commit)
 724                        die(_("could not lookup commit %s"), fixup_message);
 725                ctx.output_encoding = get_commit_output_encoding();
 726                format_commit_message(commit, "fixup! %s\n\n",
 727                                      &sb, &ctx);
 728                hook_arg1 = "message";
 729        } else if (!stat(git_path_merge_msg(), &statbuf)) {
 730                /*
 731                 * prepend SQUASH_MSG here if it exists and a
 732                 * "merge --squash" was originally performed
 733                 */
 734                if (!stat(git_path_squash_msg(), &statbuf)) {
 735                        if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
 736                                die_errno(_("could not read SQUASH_MSG"));
 737                        hook_arg1 = "squash";
 738                } else
 739                        hook_arg1 = "merge";
 740                if (strbuf_read_file(&sb, git_path_merge_msg(), 0) < 0)
 741                        die_errno(_("could not read MERGE_MSG"));
 742        } else if (!stat(git_path_squash_msg(), &statbuf)) {
 743                if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
 744                        die_errno(_("could not read SQUASH_MSG"));
 745                hook_arg1 = "squash";
 746        } else if (template_file) {
 747                if (strbuf_read_file(&sb, template_file, 0) < 0)
 748                        die_errno(_("could not read '%s'"), template_file);
 749                hook_arg1 = "template";
 750                clean_message_contents = 0;
 751        }
 752
 753        /*
 754         * The remaining cases don't modify the template message, but
 755         * just set the argument(s) to the prepare-commit-msg hook.
 756         */
 757        else if (whence == FROM_MERGE)
 758                hook_arg1 = "merge";
 759        else if (whence == FROM_CHERRY_PICK) {
 760                hook_arg1 = "commit";
 761                hook_arg2 = "CHERRY_PICK_HEAD";
 762        }
 763
 764        if (squash_message) {
 765                /*
 766                 * If squash_commit was used for the commit subject,
 767                 * then we're possibly hijacking other commit log options.
 768                 * Reset the hook args to tell the real story.
 769                 */
 770                hook_arg1 = "message";
 771                hook_arg2 = "";
 772        }
 773
 774        s->fp = fopen_for_writing(git_path_commit_editmsg());
 775        if (s->fp == NULL)
 776                die_errno(_("could not open '%s'"), git_path_commit_editmsg());
 777
 778        /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
 779        old_display_comment_prefix = s->display_comment_prefix;
 780        s->display_comment_prefix = 1;
 781
 782        /*
 783         * Most hints are counter-productive when the commit has
 784         * already started.
 785         */
 786        s->hints = 0;
 787
 788        if (clean_message_contents)
 789                strbuf_stripspace(&sb, 0);
 790
 791        if (signoff)
 792                append_signoff(&sb, ignore_non_trailer(sb.buf, sb.len), 0);
 793
 794        if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
 795                die_errno(_("could not write commit template"));
 796
 797        if (auto_comment_line_char)
 798                adjust_comment_line_char(&sb);
 799        strbuf_release(&sb);
 800
 801        /* This checks if committer ident is explicitly given */
 802        strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
 803        if (use_editor && include_status) {
 804                int ident_shown = 0;
 805                int saved_color_setting;
 806                struct ident_split ci, ai;
 807
 808                if (whence != FROM_COMMIT) {
 809                        if (cleanup_mode == CLEANUP_SCISSORS)
 810                                wt_status_add_cut_line(s->fp);
 811                        status_printf_ln(s, GIT_COLOR_NORMAL,
 812                            whence == FROM_MERGE
 813                                ? _("\n"
 814                                        "It looks like you may be committing a merge.\n"
 815                                        "If this is not correct, please remove the file\n"
 816                                        "       %s\n"
 817                                        "and try again.\n")
 818                                : _("\n"
 819                                        "It looks like you may be committing a cherry-pick.\n"
 820                                        "If this is not correct, please remove the file\n"
 821                                        "       %s\n"
 822                                        "and try again.\n"),
 823                                whence == FROM_MERGE ?
 824                                        git_path_merge_head() :
 825                                        git_path_cherry_pick_head());
 826                }
 827
 828                fprintf(s->fp, "\n");
 829                if (cleanup_mode == CLEANUP_ALL)
 830                        status_printf(s, GIT_COLOR_NORMAL,
 831                                _("Please enter the commit message for your changes."
 832                                  " Lines starting\nwith '%c' will be ignored, and an empty"
 833                                  " message aborts the commit.\n"), comment_line_char);
 834                else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
 835                        wt_status_add_cut_line(s->fp);
 836                else /* CLEANUP_SPACE, that is. */
 837                        status_printf(s, GIT_COLOR_NORMAL,
 838                                _("Please enter the commit message for your changes."
 839                                  " Lines starting\n"
 840                                  "with '%c' will be kept; you may remove them"
 841                                  " yourself if you want to.\n"
 842                                  "An empty message aborts the commit.\n"), comment_line_char);
 843
 844                /*
 845                 * These should never fail because they come from our own
 846                 * fmt_ident. They may fail the sane_ident test, but we know
 847                 * that the name and mail pointers will at least be valid,
 848                 * which is enough for our tests and printing here.
 849                 */
 850                assert_split_ident(&ai, author_ident);
 851                assert_split_ident(&ci, &committer_ident);
 852
 853                if (ident_cmp(&ai, &ci))
 854                        status_printf_ln(s, GIT_COLOR_NORMAL,
 855                                _("%s"
 856                                "Author:    %.*s <%.*s>"),
 857                                ident_shown++ ? "" : "\n",
 858                                (int)(ai.name_end - ai.name_begin), ai.name_begin,
 859                                (int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
 860
 861                if (author_date_is_interesting())
 862                        status_printf_ln(s, GIT_COLOR_NORMAL,
 863                                _("%s"
 864                                "Date:      %s"),
 865                                ident_shown++ ? "" : "\n",
 866                                show_ident_date(&ai, DATE_MODE(NORMAL)));
 867
 868                if (!committer_ident_sufficiently_given())
 869                        status_printf_ln(s, GIT_COLOR_NORMAL,
 870                                _("%s"
 871                                "Committer: %.*s <%.*s>"),
 872                                ident_shown++ ? "" : "\n",
 873                                (int)(ci.name_end - ci.name_begin), ci.name_begin,
 874                                (int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
 875
 876                status_printf_ln(s, GIT_COLOR_NORMAL, "%s", ""); /* Add new line for clarity */
 877
 878                saved_color_setting = s->use_color;
 879                s->use_color = 0;
 880                commitable = run_status(s->fp, index_file, prefix, 1, s);
 881                s->use_color = saved_color_setting;
 882        } else {
 883                struct object_id oid;
 884                const char *parent = "HEAD";
 885
 886                if (!active_nr && read_cache() < 0)
 887                        die(_("Cannot read index"));
 888
 889                if (amend)
 890                        parent = "HEAD^1";
 891
 892                if (get_sha1(parent, oid.hash)) {
 893                        int i, ita_nr = 0;
 894
 895                        for (i = 0; i < active_nr; i++)
 896                                if (ce_intent_to_add(active_cache[i]))
 897                                        ita_nr++;
 898                        commitable = active_nr - ita_nr > 0;
 899                } else {
 900                        /*
 901                         * Unless the user did explicitly request a submodule
 902                         * ignore mode by passing a command line option we do
 903                         * not ignore any changed submodule SHA-1s when
 904                         * comparing index and parent, no matter what is
 905                         * configured. Otherwise we won't commit any
 906                         * submodules which were manually staged, which would
 907                         * be really confusing.
 908                         */
 909                        int diff_flags = DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG;
 910                        if (ignore_submodule_arg &&
 911                            !strcmp(ignore_submodule_arg, "all"))
 912                                diff_flags |= DIFF_OPT_IGNORE_SUBMODULES;
 913                        commitable = index_differs_from(parent, diff_flags, 1);
 914                }
 915        }
 916        strbuf_release(&committer_ident);
 917
 918        fclose(s->fp);
 919
 920        /*
 921         * Reject an attempt to record a non-merge empty commit without
 922         * explicit --allow-empty. In the cherry-pick case, it may be
 923         * empty due to conflict resolution, which the user should okay.
 924         */
 925        if (!commitable && whence != FROM_MERGE && !allow_empty &&
 926            !(amend && is_a_merge(current_head))) {
 927                s->display_comment_prefix = old_display_comment_prefix;
 928                run_status(stdout, index_file, prefix, 0, s);
 929                if (amend)
 930                        fputs(_(empty_amend_advice), stderr);
 931                else if (whence == FROM_CHERRY_PICK) {
 932                        fputs(_(empty_cherry_pick_advice), stderr);
 933                        if (!sequencer_in_use)
 934                                fputs(_(empty_cherry_pick_advice_single), stderr);
 935                        else
 936                                fputs(_(empty_cherry_pick_advice_multi), stderr);
 937                }
 938                return 0;
 939        }
 940
 941        /*
 942         * Re-read the index as pre-commit hook could have updated it,
 943         * and write it out as a tree.  We must do this before we invoke
 944         * the editor and after we invoke run_status above.
 945         */
 946        discard_cache();
 947        read_cache_from(index_file);
 948        if (update_main_cache_tree(0)) {
 949                error(_("Error building trees"));
 950                return 0;
 951        }
 952
 953        if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
 954                            git_path_commit_editmsg(), hook_arg1, hook_arg2, NULL))
 955                return 0;
 956
 957        if (use_editor) {
 958                struct argv_array env = ARGV_ARRAY_INIT;
 959
 960                argv_array_pushf(&env, "GIT_INDEX_FILE=%s", index_file);
 961                if (launch_editor(git_path_commit_editmsg(), NULL, env.argv)) {
 962                        fprintf(stderr,
 963                        _("Please supply the message using either -m or -F option.\n"));
 964                        exit(1);
 965                }
 966                argv_array_clear(&env);
 967        }
 968
 969        if (!no_verify &&
 970            run_commit_hook(use_editor, index_file, "commit-msg", git_path_commit_editmsg(), NULL)) {
 971                return 0;
 972        }
 973
 974        return 1;
 975}
 976
 977static int rest_is_empty(struct strbuf *sb, int start)
 978{
 979        int i, eol;
 980        const char *nl;
 981
 982        /* Check if the rest is just whitespace and Signed-of-by's. */
 983        for (i = start; i < sb->len; i++) {
 984                nl = memchr(sb->buf + i, '\n', sb->len - i);
 985                if (nl)
 986                        eol = nl - sb->buf;
 987                else
 988                        eol = sb->len;
 989
 990                if (strlen(sign_off_header) <= eol - i &&
 991                    starts_with(sb->buf + i, sign_off_header)) {
 992                        i = eol;
 993                        continue;
 994                }
 995                while (i < eol)
 996                        if (!isspace(sb->buf[i++]))
 997                                return 0;
 998        }
 999
1000        return 1;
1001}
1002
1003/*
1004 * Find out if the message in the strbuf contains only whitespace and
1005 * Signed-off-by lines.
1006 */
1007static int message_is_empty(struct strbuf *sb)
1008{
1009        if (cleanup_mode == CLEANUP_NONE && sb->len)
1010                return 0;
1011        return rest_is_empty(sb, 0);
1012}
1013
1014/*
1015 * See if the user edited the message in the editor or left what
1016 * was in the template intact
1017 */
1018static int template_untouched(struct strbuf *sb)
1019{
1020        struct strbuf tmpl = STRBUF_INIT;
1021        const char *start;
1022
1023        if (cleanup_mode == CLEANUP_NONE && sb->len)
1024                return 0;
1025
1026        if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1027                return 0;
1028
1029        strbuf_stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
1030        if (!skip_prefix(sb->buf, tmpl.buf, &start))
1031                start = sb->buf;
1032        strbuf_release(&tmpl);
1033        return rest_is_empty(sb, start - sb->buf);
1034}
1035
1036static const char *find_author_by_nickname(const char *name)
1037{
1038        struct rev_info revs;
1039        struct commit *commit;
1040        struct strbuf buf = STRBUF_INIT;
1041        struct string_list mailmap = STRING_LIST_INIT_NODUP;
1042        const char *av[20];
1043        int ac = 0;
1044
1045        init_revisions(&revs, NULL);
1046        strbuf_addf(&buf, "--author=%s", name);
1047        av[++ac] = "--all";
1048        av[++ac] = "-i";
1049        av[++ac] = buf.buf;
1050        av[++ac] = NULL;
1051        setup_revisions(ac, av, &revs, NULL);
1052        revs.mailmap = &mailmap;
1053        read_mailmap(revs.mailmap, NULL);
1054
1055        if (prepare_revision_walk(&revs))
1056                die(_("revision walk setup failed"));
1057        commit = get_revision(&revs);
1058        if (commit) {
1059                struct pretty_print_context ctx = {0};
1060                ctx.date_mode.type = DATE_NORMAL;
1061                strbuf_release(&buf);
1062                format_commit_message(commit, "%aN <%aE>", &buf, &ctx);
1063                clear_mailmap(&mailmap);
1064                return strbuf_detach(&buf, NULL);
1065        }
1066        die(_("--author '%s' is not 'Name <email>' and matches no existing author"), name);
1067}
1068
1069
1070static void handle_untracked_files_arg(struct wt_status *s)
1071{
1072        if (!untracked_files_arg)
1073                ; /* default already initialized */
1074        else if (!strcmp(untracked_files_arg, "no"))
1075                s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1076        else if (!strcmp(untracked_files_arg, "normal"))
1077                s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1078        else if (!strcmp(untracked_files_arg, "all"))
1079                s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1080        else
1081                die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
1082}
1083
1084static const char *read_commit_message(const char *name)
1085{
1086        const char *out_enc;
1087        struct commit *commit;
1088
1089        commit = lookup_commit_reference_by_name(name);
1090        if (!commit)
1091                die(_("could not lookup commit %s"), name);
1092        out_enc = get_commit_output_encoding();
1093        return logmsg_reencode(commit, NULL, out_enc);
1094}
1095
1096/*
1097 * Enumerate what needs to be propagated when --porcelain
1098 * is not in effect here.
1099 */
1100static struct status_deferred_config {
1101        enum wt_status_format status_format;
1102        int show_branch;
1103} status_deferred_config = {
1104        STATUS_FORMAT_UNSPECIFIED,
1105        -1 /* unspecified */
1106};
1107
1108static void finalize_deferred_config(struct wt_status *s)
1109{
1110        int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
1111                                   status_format != STATUS_FORMAT_PORCELAIN_V2 &&
1112                                   !s->null_termination);
1113
1114        if (s->null_termination) {
1115                if (status_format == STATUS_FORMAT_NONE ||
1116                    status_format == STATUS_FORMAT_UNSPECIFIED)
1117                        status_format = STATUS_FORMAT_PORCELAIN;
1118                else if (status_format == STATUS_FORMAT_LONG)
1119                        die(_("--long and -z are incompatible"));
1120        }
1121
1122        if (use_deferred_config && status_format == STATUS_FORMAT_UNSPECIFIED)
1123                status_format = status_deferred_config.status_format;
1124        if (status_format == STATUS_FORMAT_UNSPECIFIED)
1125                status_format = STATUS_FORMAT_NONE;
1126
1127        if (use_deferred_config && s->show_branch < 0)
1128                s->show_branch = status_deferred_config.show_branch;
1129        if (s->show_branch < 0)
1130                s->show_branch = 0;
1131}
1132
1133static int parse_and_validate_options(int argc, const char *argv[],
1134                                      const struct option *options,
1135                                      const char * const usage[],
1136                                      const char *prefix,
1137                                      struct commit *current_head,
1138                                      struct wt_status *s)
1139{
1140        int f = 0;
1141
1142        argc = parse_options(argc, argv, prefix, options, usage, 0);
1143        finalize_deferred_config(s);
1144
1145        if (force_author && !strchr(force_author, '>'))
1146                force_author = find_author_by_nickname(force_author);
1147
1148        if (force_author && renew_authorship)
1149                die(_("Using both --reset-author and --author does not make sense"));
1150
1151        if (logfile || have_option_m || use_message || fixup_message)
1152                use_editor = 0;
1153        if (0 <= edit_flag)
1154                use_editor = edit_flag;
1155
1156        /* Sanity check options */
1157        if (amend && !current_head)
1158                die(_("You have nothing to amend."));
1159        if (amend && whence != FROM_COMMIT) {
1160                if (whence == FROM_MERGE)
1161                        die(_("You are in the middle of a merge -- cannot amend."));
1162                else if (whence == FROM_CHERRY_PICK)
1163                        die(_("You are in the middle of a cherry-pick -- cannot amend."));
1164        }
1165        if (fixup_message && squash_message)
1166                die(_("Options --squash and --fixup cannot be used together"));
1167        if (use_message)
1168                f++;
1169        if (edit_message)
1170                f++;
1171        if (fixup_message)
1172                f++;
1173        if (logfile)
1174                f++;
1175        if (f > 1)
1176                die(_("Only one of -c/-C/-F/--fixup can be used."));
1177        if (have_option_m && f > 0)
1178                die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
1179        if (f || have_option_m)
1180                template_file = NULL;
1181        if (edit_message)
1182                use_message = edit_message;
1183        if (amend && !use_message && !fixup_message)
1184                use_message = "HEAD";
1185        if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship)
1186                die(_("--reset-author can be used only with -C, -c or --amend."));
1187        if (use_message) {
1188                use_message_buffer = read_commit_message(use_message);
1189                if (!renew_authorship) {
1190                        author_message = use_message;
1191                        author_message_buffer = use_message_buffer;
1192                }
1193        }
1194        if (whence == FROM_CHERRY_PICK && !renew_authorship) {
1195                author_message = "CHERRY_PICK_HEAD";
1196                author_message_buffer = read_commit_message(author_message);
1197        }
1198
1199        if (patch_interactive)
1200                interactive = 1;
1201
1202        if (also + only + all + interactive > 1)
1203                die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
1204        if (argc == 0 && (also || (only && !amend && !allow_empty)))
1205                die(_("No paths with --include/--only does not make sense."));
1206        if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
1207                cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
1208        else if (!strcmp(cleanup_arg, "verbatim"))
1209                cleanup_mode = CLEANUP_NONE;
1210        else if (!strcmp(cleanup_arg, "whitespace"))
1211                cleanup_mode = CLEANUP_SPACE;
1212        else if (!strcmp(cleanup_arg, "strip"))
1213                cleanup_mode = CLEANUP_ALL;
1214        else if (!strcmp(cleanup_arg, "scissors"))
1215                cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
1216        else
1217                die(_("Invalid cleanup mode %s"), cleanup_arg);
1218
1219        handle_untracked_files_arg(s);
1220
1221        if (all && argc > 0)
1222                die(_("Paths with -a does not make sense."));
1223
1224        if (status_format != STATUS_FORMAT_NONE)
1225                dry_run = 1;
1226
1227        return argc;
1228}
1229
1230static int dry_run_commit(int argc, const char **argv, const char *prefix,
1231                          const struct commit *current_head, struct wt_status *s)
1232{
1233        int commitable;
1234        const char *index_file;
1235
1236        index_file = prepare_index(argc, argv, prefix, current_head, 1);
1237        commitable = run_status(stdout, index_file, prefix, 0, s);
1238        rollback_index_files();
1239
1240        return commitable ? 0 : 1;
1241}
1242
1243static int parse_status_slot(const char *slot)
1244{
1245        if (!strcasecmp(slot, "header"))
1246                return WT_STATUS_HEADER;
1247        if (!strcasecmp(slot, "branch"))
1248                return WT_STATUS_ONBRANCH;
1249        if (!strcasecmp(slot, "updated") || !strcasecmp(slot, "added"))
1250                return WT_STATUS_UPDATED;
1251        if (!strcasecmp(slot, "changed"))
1252                return WT_STATUS_CHANGED;
1253        if (!strcasecmp(slot, "untracked"))
1254                return WT_STATUS_UNTRACKED;
1255        if (!strcasecmp(slot, "nobranch"))
1256                return WT_STATUS_NOBRANCH;
1257        if (!strcasecmp(slot, "unmerged"))
1258                return WT_STATUS_UNMERGED;
1259        return -1;
1260}
1261
1262static int git_status_config(const char *k, const char *v, void *cb)
1263{
1264        struct wt_status *s = cb;
1265        const char *slot_name;
1266
1267        if (starts_with(k, "column."))
1268                return git_column_config(k, v, "status", &s->colopts);
1269        if (!strcmp(k, "status.submodulesummary")) {
1270                int is_bool;
1271                s->submodule_summary = git_config_bool_or_int(k, v, &is_bool);
1272                if (is_bool && s->submodule_summary)
1273                        s->submodule_summary = -1;
1274                return 0;
1275        }
1276        if (!strcmp(k, "status.short")) {
1277                if (git_config_bool(k, v))
1278                        status_deferred_config.status_format = STATUS_FORMAT_SHORT;
1279                else
1280                        status_deferred_config.status_format = STATUS_FORMAT_NONE;
1281                return 0;
1282        }
1283        if (!strcmp(k, "status.branch")) {
1284                status_deferred_config.show_branch = git_config_bool(k, v);
1285                return 0;
1286        }
1287        if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
1288                s->use_color = git_config_colorbool(k, v);
1289                return 0;
1290        }
1291        if (!strcmp(k, "status.displaycommentprefix")) {
1292                s->display_comment_prefix = git_config_bool(k, v);
1293                return 0;
1294        }
1295        if (skip_prefix(k, "status.color.", &slot_name) ||
1296            skip_prefix(k, "color.status.", &slot_name)) {
1297                int slot = parse_status_slot(slot_name);
1298                if (slot < 0)
1299                        return 0;
1300                if (!v)
1301                        return config_error_nonbool(k);
1302                return color_parse(v, s->color_palette[slot]);
1303        }
1304        if (!strcmp(k, "status.relativepaths")) {
1305                s->relative_paths = git_config_bool(k, v);
1306                return 0;
1307        }
1308        if (!strcmp(k, "status.showuntrackedfiles")) {
1309                if (!v)
1310                        return config_error_nonbool(k);
1311                else if (!strcmp(v, "no"))
1312                        s->show_untracked_files = SHOW_NO_UNTRACKED_FILES;
1313                else if (!strcmp(v, "normal"))
1314                        s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
1315                else if (!strcmp(v, "all"))
1316                        s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
1317                else
1318                        return error(_("Invalid untracked files mode '%s'"), v);
1319                return 0;
1320        }
1321        return git_diff_ui_config(k, v, NULL);
1322}
1323
1324int cmd_status(int argc, const char **argv, const char *prefix)
1325{
1326        static struct wt_status s;
1327        int fd;
1328        struct object_id oid;
1329        static struct option builtin_status_options[] = {
1330                OPT__VERBOSE(&verbose, N_("be verbose")),
1331                OPT_SET_INT('s', "short", &status_format,
1332                            N_("show status concisely"), STATUS_FORMAT_SHORT),
1333                OPT_BOOL('b', "branch", &s.show_branch,
1334                         N_("show branch information")),
1335                { OPTION_CALLBACK, 0, "porcelain", &status_format,
1336                  N_("version"), N_("machine-readable output"),
1337                  PARSE_OPT_OPTARG, opt_parse_porcelain },
1338                OPT_SET_INT(0, "long", &status_format,
1339                            N_("show status in long format (default)"),
1340                            STATUS_FORMAT_LONG),
1341                OPT_BOOL('z', "null", &s.null_termination,
1342                         N_("terminate entries with NUL")),
1343                { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
1344                  N_("mode"),
1345                  N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
1346                  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1347                OPT_BOOL(0, "ignored", &show_ignored_in_status,
1348                         N_("show ignored files")),
1349                { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
1350                  N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
1351                  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
1352                OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
1353                OPT_END(),
1354        };
1355
1356        if (argc == 2 && !strcmp(argv[1], "-h"))
1357                usage_with_options(builtin_status_usage, builtin_status_options);
1358
1359        status_init_config(&s, git_status_config);
1360        argc = parse_options(argc, argv, prefix,
1361                             builtin_status_options,
1362                             builtin_status_usage, 0);
1363        finalize_colopts(&s.colopts, -1);
1364        finalize_deferred_config(&s);
1365
1366        handle_untracked_files_arg(&s);
1367        if (show_ignored_in_status)
1368                s.show_ignored_files = 1;
1369        parse_pathspec(&s.pathspec, 0,
1370                       PATHSPEC_PREFER_FULL,
1371                       prefix, argv);
1372
1373        read_cache_preload(&s.pathspec);
1374        refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
1375
1376        fd = hold_locked_index(&index_lock, 0);
1377
1378        s.is_initial = get_sha1(s.reference, oid.hash) ? 1 : 0;
1379        if (!s.is_initial)
1380                hashcpy(s.sha1_commit, oid.hash);
1381
1382        s.ignore_submodule_arg = ignore_submodule_arg;
1383        s.status_format = status_format;
1384        s.verbose = verbose;
1385
1386        wt_status_collect(&s);
1387
1388        if (0 <= fd)
1389                update_index_if_able(&the_index, &index_lock);
1390
1391        if (s.relative_paths)
1392                s.prefix = prefix;
1393
1394        wt_status_print(&s);
1395        return 0;
1396}
1397
1398static const char *implicit_ident_advice(void)
1399{
1400        char *user_config = expand_user_path("~/.gitconfig", 0);
1401        char *xdg_config = xdg_config_home("config");
1402        int config_exists = file_exists(user_config) || file_exists(xdg_config);
1403
1404        free(user_config);
1405        free(xdg_config);
1406
1407        if (config_exists)
1408                return _(implicit_ident_advice_config);
1409        else
1410                return _(implicit_ident_advice_noconfig);
1411
1412}
1413
1414static void print_summary(const char *prefix, const struct object_id *oid,
1415                          int initial_commit)
1416{
1417        struct rev_info rev;
1418        struct commit *commit;
1419        struct strbuf format = STRBUF_INIT;
1420        struct object_id junk_oid;
1421        const char *head;
1422        struct pretty_print_context pctx = {0};
1423        struct strbuf author_ident = STRBUF_INIT;
1424        struct strbuf committer_ident = STRBUF_INIT;
1425
1426        commit = lookup_commit(oid->hash);
1427        if (!commit)
1428                die(_("couldn't look up newly created commit"));
1429        if (parse_commit(commit))
1430                die(_("could not parse newly created commit"));
1431
1432        strbuf_addstr(&format, "format:%h] %s");
1433
1434        format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1435        format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1436        if (strbuf_cmp(&author_ident, &committer_ident)) {
1437                strbuf_addstr(&format, "\n Author: ");
1438                strbuf_addbuf_percentquote(&format, &author_ident);
1439        }
1440        if (author_date_is_interesting()) {
1441                struct strbuf date = STRBUF_INIT;
1442                format_commit_message(commit, "%ad", &date, &pctx);
1443                strbuf_addstr(&format, "\n Date: ");
1444                strbuf_addbuf_percentquote(&format, &date);
1445                strbuf_release(&date);
1446        }
1447        if (!committer_ident_sufficiently_given()) {
1448                strbuf_addstr(&format, "\n Committer: ");
1449                strbuf_addbuf_percentquote(&format, &committer_ident);
1450                if (advice_implicit_identity) {
1451                        strbuf_addch(&format, '\n');
1452                        strbuf_addstr(&format, implicit_ident_advice());
1453                }
1454        }
1455        strbuf_release(&author_ident);
1456        strbuf_release(&committer_ident);
1457
1458        init_revisions(&rev, prefix);
1459        setup_revisions(0, NULL, &rev, NULL);
1460
1461        rev.diff = 1;
1462        rev.diffopt.output_format =
1463                DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1464
1465        rev.verbose_header = 1;
1466        rev.show_root_diff = 1;
1467        get_commit_format(format.buf, &rev);
1468        rev.always_show_header = 0;
1469        rev.diffopt.detect_rename = 1;
1470        rev.diffopt.break_opt = 0;
1471        diff_setup_done(&rev.diffopt);
1472
1473        head = resolve_ref_unsafe("HEAD", 0, junk_oid.hash, NULL);
1474        if (!strcmp(head, "HEAD"))
1475                head = _("detached HEAD");
1476        else
1477                skip_prefix(head, "refs/heads/", &head);
1478        printf("[%s%s ", head, initial_commit ? _(" (root-commit)") : "");
1479
1480        if (!log_tree_commit(&rev, commit)) {
1481                rev.always_show_header = 1;
1482                rev.use_terminator = 1;
1483                log_tree_commit(&rev, commit);
1484        }
1485
1486        strbuf_release(&format);
1487}
1488
1489static int git_commit_config(const char *k, const char *v, void *cb)
1490{
1491        struct wt_status *s = cb;
1492        int status;
1493
1494        if (!strcmp(k, "commit.template"))
1495                return git_config_pathname(&template_file, k, v);
1496        if (!strcmp(k, "commit.status")) {
1497                include_status = git_config_bool(k, v);
1498                return 0;
1499        }
1500        if (!strcmp(k, "commit.cleanup"))
1501                return git_config_string(&cleanup_arg, k, v);
1502        if (!strcmp(k, "commit.gpgsign")) {
1503                sign_commit = git_config_bool(k, v) ? "" : NULL;
1504                return 0;
1505        }
1506        if (!strcmp(k, "commit.verbose")) {
1507                int is_bool;
1508                config_commit_verbose = git_config_bool_or_int(k, v, &is_bool);
1509                return 0;
1510        }
1511
1512        status = git_gpg_config(k, v, NULL);
1513        if (status)
1514                return status;
1515        return git_status_config(k, v, s);
1516}
1517
1518static int run_rewrite_hook(const struct object_id *oldoid,
1519                            const struct object_id *newoid)
1520{
1521        struct child_process proc = CHILD_PROCESS_INIT;
1522        const char *argv[3];
1523        int code;
1524        struct strbuf sb = STRBUF_INIT;
1525
1526        argv[0] = find_hook("post-rewrite");
1527        if (!argv[0])
1528                return 0;
1529
1530        argv[1] = "amend";
1531        argv[2] = NULL;
1532
1533        proc.argv = argv;
1534        proc.in = -1;
1535        proc.stdout_to_stderr = 1;
1536
1537        code = start_command(&proc);
1538        if (code)
1539                return code;
1540        strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1541        sigchain_push(SIGPIPE, SIG_IGN);
1542        write_in_full(proc.in, sb.buf, sb.len);
1543        close(proc.in);
1544        strbuf_release(&sb);
1545        sigchain_pop(SIGPIPE);
1546        return finish_command(&proc);
1547}
1548
1549int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
1550{
1551        struct argv_array hook_env = ARGV_ARRAY_INIT;
1552        va_list args;
1553        int ret;
1554
1555        argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", index_file);
1556
1557        /*
1558         * Let the hook know that no editor will be launched.
1559         */
1560        if (!editor_is_used)
1561                argv_array_push(&hook_env, "GIT_EDITOR=:");
1562
1563        va_start(args, name);
1564        ret = run_hook_ve(hook_env.argv,name, args);
1565        va_end(args);
1566        argv_array_clear(&hook_env);
1567
1568        return ret;
1569}
1570
1571int cmd_commit(int argc, const char **argv, const char *prefix)
1572{
1573        static struct wt_status s;
1574        static struct option builtin_commit_options[] = {
1575                OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
1576                OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
1577
1578                OPT_GROUP(N_("Commit message options")),
1579                OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
1580                OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
1581                OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
1582                OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
1583                OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
1584                OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
1585                OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
1586                OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
1587                OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
1588                OPT_BOOL('s', "signoff", &signoff, N_("add Signed-off-by:")),
1589                OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
1590                OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
1591                OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
1592                OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
1593                { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
1594                  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
1595                /* end commit message options */
1596
1597                OPT_GROUP(N_("Commit contents options")),
1598                OPT_BOOL('a', "all", &all, N_("commit all changed files")),
1599                OPT_BOOL('i', "include", &also, N_("add specified files to index for commit")),
1600                OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
1601                OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
1602                OPT_BOOL('o', "only", &only, N_("commit only specified files")),
1603                OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit and commit-msg hooks")),
1604                OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),
1605                OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
1606                            STATUS_FORMAT_SHORT),
1607                OPT_BOOL(0, "branch", &s.show_branch, N_("show branch information")),
1608                OPT_SET_INT(0, "porcelain", &status_format,
1609                            N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
1610                OPT_SET_INT(0, "long", &status_format,
1611                            N_("show status in long format (default)"),
1612                            STATUS_FORMAT_LONG),
1613                OPT_BOOL('z', "null", &s.null_termination,
1614                         N_("terminate entries with NUL")),
1615                OPT_BOOL(0, "amend", &amend, N_("amend previous commit")),
1616                OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
1617                { 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" },
1618                /* end commit contents options */
1619
1620                OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty,
1621                                N_("ok to record an empty change")),
1622                OPT_HIDDEN_BOOL(0, "allow-empty-message", &allow_empty_message,
1623                                N_("ok to record a change with an empty message")),
1624
1625                OPT_END()
1626        };
1627
1628        struct strbuf sb = STRBUF_INIT;
1629        struct strbuf author_ident = STRBUF_INIT;
1630        const char *index_file, *reflog_msg;
1631        char *nl;
1632        struct object_id oid;
1633        struct commit_list *parents = NULL;
1634        struct stat statbuf;
1635        struct commit *current_head = NULL;
1636        struct commit_extra_header *extra = NULL;
1637        struct ref_transaction *transaction;
1638        struct strbuf err = STRBUF_INIT;
1639
1640        if (argc == 2 && !strcmp(argv[1], "-h"))
1641                usage_with_options(builtin_commit_usage, builtin_commit_options);
1642
1643        status_init_config(&s, git_commit_config);
1644        status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
1645        s.colopts = 0;
1646
1647        if (get_sha1("HEAD", oid.hash))
1648                current_head = NULL;
1649        else {
1650                current_head = lookup_commit_or_die(oid.hash, "HEAD");
1651                if (parse_commit(current_head))
1652                        die(_("could not parse HEAD commit"));
1653        }
1654        verbose = -1; /* unspecified */
1655        argc = parse_and_validate_options(argc, argv, builtin_commit_options,
1656                                          builtin_commit_usage,
1657                                          prefix, current_head, &s);
1658        if (verbose == -1)
1659                verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose;
1660
1661        if (dry_run)
1662                return dry_run_commit(argc, argv, prefix, current_head, &s);
1663        index_file = prepare_index(argc, argv, prefix, current_head, 0);
1664
1665        /* Set up everything for writing the commit object.  This includes
1666           running hooks, writing the trees, and interacting with the user.  */
1667        if (!prepare_to_commit(index_file, prefix,
1668                               current_head, &s, &author_ident)) {
1669                rollback_index_files();
1670                return 1;
1671        }
1672
1673        /* Determine parents */
1674        reflog_msg = getenv("GIT_REFLOG_ACTION");
1675        if (!current_head) {
1676                if (!reflog_msg)
1677                        reflog_msg = "commit (initial)";
1678        } else if (amend) {
1679                if (!reflog_msg)
1680                        reflog_msg = "commit (amend)";
1681                parents = copy_commit_list(current_head->parents);
1682        } else if (whence == FROM_MERGE) {
1683                struct strbuf m = STRBUF_INIT;
1684                FILE *fp;
1685                int allow_fast_forward = 1;
1686                struct commit_list **pptr = &parents;
1687
1688                if (!reflog_msg)
1689                        reflog_msg = "commit (merge)";
1690                pptr = commit_list_append(current_head, pptr);
1691                fp = fopen(git_path_merge_head(), "r");
1692                if (fp == NULL)
1693                        die_errno(_("could not open '%s' for reading"),
1694                                  git_path_merge_head());
1695                while (strbuf_getline_lf(&m, fp) != EOF) {
1696                        struct commit *parent;
1697
1698                        parent = get_merge_parent(m.buf);
1699                        if (!parent)
1700                                die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
1701                        pptr = commit_list_append(parent, pptr);
1702                }
1703                fclose(fp);
1704                strbuf_release(&m);
1705                if (!stat(git_path_merge_mode(), &statbuf)) {
1706                        if (strbuf_read_file(&sb, git_path_merge_mode(), 0) < 0)
1707                                die_errno(_("could not read MERGE_MODE"));
1708                        if (!strcmp(sb.buf, "no-ff"))
1709                                allow_fast_forward = 0;
1710                }
1711                if (allow_fast_forward)
1712                        parents = reduce_heads(parents);
1713        } else {
1714                if (!reflog_msg)
1715                        reflog_msg = (whence == FROM_CHERRY_PICK)
1716                                        ? "commit (cherry-pick)"
1717                                        : "commit";
1718                commit_list_insert(current_head, &parents);
1719        }
1720
1721        /* Finally, get the commit message */
1722        strbuf_reset(&sb);
1723        if (strbuf_read_file(&sb, git_path_commit_editmsg(), 0) < 0) {
1724                int saved_errno = errno;
1725                rollback_index_files();
1726                die(_("could not read commit message: %s"), strerror(saved_errno));
1727        }
1728
1729        if (verbose || /* Truncate the message just before the diff, if any. */
1730            cleanup_mode == CLEANUP_SCISSORS)
1731                wt_status_truncate_message_at_cut_line(&sb);
1732
1733        if (cleanup_mode != CLEANUP_NONE)
1734                strbuf_stripspace(&sb, cleanup_mode == CLEANUP_ALL);
1735        if (template_untouched(&sb) && !allow_empty_message) {
1736                rollback_index_files();
1737                fprintf(stderr, _("Aborting commit; you did not edit the message.\n"));
1738                exit(1);
1739        }
1740        if (message_is_empty(&sb) && !allow_empty_message) {
1741                rollback_index_files();
1742                fprintf(stderr, _("Aborting commit due to empty commit message.\n"));
1743                exit(1);
1744        }
1745
1746        if (amend) {
1747                const char *exclude_gpgsig[2] = { "gpgsig", NULL };
1748                extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1749        } else {
1750                struct commit_extra_header **tail = &extra;
1751                append_merge_tag_headers(parents, &tail);
1752        }
1753
1754        if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->sha1,
1755                         parents, oid.hash, author_ident.buf, sign_commit, extra)) {
1756                rollback_index_files();
1757                die(_("failed to write commit object"));
1758        }
1759        strbuf_release(&author_ident);
1760        free_commit_extra_headers(extra);
1761
1762        nl = strchr(sb.buf, '\n');
1763        if (nl)
1764                strbuf_setlen(&sb, nl + 1 - sb.buf);
1765        else
1766                strbuf_addch(&sb, '\n');
1767        strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
1768        strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
1769
1770        transaction = ref_transaction_begin(&err);
1771        if (!transaction ||
1772            ref_transaction_update(transaction, "HEAD", oid.hash,
1773                                   current_head
1774                                   ? current_head->object.oid.hash : null_sha1,
1775                                   0, sb.buf, &err) ||
1776            ref_transaction_commit(transaction, &err)) {
1777                rollback_index_files();
1778                die("%s", err.buf);
1779        }
1780        ref_transaction_free(transaction);
1781
1782        unlink(git_path_cherry_pick_head());
1783        unlink(git_path_revert_head());
1784        unlink(git_path_merge_head());
1785        unlink(git_path_merge_msg());
1786        unlink(git_path_merge_mode());
1787        unlink(git_path_squash_msg());
1788
1789        if (commit_index_files())
1790                die (_("Repository has been updated, but unable to write\n"
1791                     "new_index file. Check that disk is not full and quota is\n"
1792                     "not exceeded, and then \"git reset HEAD\" to recover."));
1793
1794        rerere(0);
1795        run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
1796        if (amend && !no_post_rewrite) {
1797                struct notes_rewrite_cfg *cfg;
1798                cfg = init_copy_notes_for_rewrite("amend");
1799                if (cfg) {
1800                        /* we are amending, so current_head is not NULL */
1801                        copy_note_for_rewrite(cfg, current_head->object.oid.hash, oid.hash);
1802                        finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1803                }
1804                run_rewrite_hook(&current_head->object.oid, &oid);
1805        }
1806        if (!quiet)
1807                print_summary(prefix, &oid, !current_head);
1808
1809        strbuf_release(&err);
1810        return 0;
1811}