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