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