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