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