builtin / log.con commit Merge branch 'tg/stash-keep-index-with-removed-paths' (f8aee85)
   1/*
   2 * Builtin "git log" and related commands (show, whatchanged)
   3 *
   4 * (C) Copyright 2006 Linus Torvalds
   5 *               2006 Junio Hamano
   6 */
   7#define USE_THE_INDEX_COMPATIBILITY_MACROS
   8#include "cache.h"
   9#include "config.h"
  10#include "refs.h"
  11#include "object-store.h"
  12#include "color.h"
  13#include "commit.h"
  14#include "diff.h"
  15#include "revision.h"
  16#include "log-tree.h"
  17#include "builtin.h"
  18#include "tag.h"
  19#include "reflog-walk.h"
  20#include "patch-ids.h"
  21#include "run-command.h"
  22#include "shortlog.h"
  23#include "remote.h"
  24#include "string-list.h"
  25#include "parse-options.h"
  26#include "line-log.h"
  27#include "branch.h"
  28#include "streaming.h"
  29#include "version.h"
  30#include "mailmap.h"
  31#include "gpg-interface.h"
  32#include "progress.h"
  33#include "commit-slab.h"
  34#include "repository.h"
  35#include "commit-reach.h"
  36#include "interdiff.h"
  37#include "range-diff.h"
  38
  39#define MAIL_DEFAULT_WRAP 72
  40
  41/* Set a default date-time format for git log ("log.date" config variable) */
  42static const char *default_date_mode = NULL;
  43
  44static int default_abbrev_commit;
  45static int default_show_root = 1;
  46static int default_follow;
  47static int default_show_signature;
  48static int decoration_style;
  49static int decoration_given;
  50static int use_mailmap_config = -1;
  51static const char *fmt_patch_subject_prefix = "PATCH";
  52static const char *fmt_pretty;
  53
  54static const char * const builtin_log_usage[] = {
  55        N_("git log [<options>] [<revision-range>] [[--] <path>...]"),
  56        N_("git show [<options>] <object>..."),
  57        NULL
  58};
  59
  60struct line_opt_callback_data {
  61        struct rev_info *rev;
  62        const char *prefix;
  63        struct string_list args;
  64};
  65
  66static int session_is_interactive(void)
  67{
  68        return isatty(1) || pager_in_use();
  69}
  70
  71static int auto_decoration_style(void)
  72{
  73        return session_is_interactive() ? DECORATE_SHORT_REFS : 0;
  74}
  75
  76static int parse_decoration_style(const char *value)
  77{
  78        switch (git_parse_maybe_bool(value)) {
  79        case 1:
  80                return DECORATE_SHORT_REFS;
  81        case 0:
  82                return 0;
  83        default:
  84                break;
  85        }
  86        if (!strcmp(value, "full"))
  87                return DECORATE_FULL_REFS;
  88        else if (!strcmp(value, "short"))
  89                return DECORATE_SHORT_REFS;
  90        else if (!strcmp(value, "auto"))
  91                return auto_decoration_style();
  92        /*
  93         * Please update _git_log() in git-completion.bash when you
  94         * add new decoration styles.
  95         */
  96        return -1;
  97}
  98
  99static int decorate_callback(const struct option *opt, const char *arg, int unset)
 100{
 101        if (unset)
 102                decoration_style = 0;
 103        else if (arg)
 104                decoration_style = parse_decoration_style(arg);
 105        else
 106                decoration_style = DECORATE_SHORT_REFS;
 107
 108        if (decoration_style < 0)
 109                die(_("invalid --decorate option: %s"), arg);
 110
 111        decoration_given = 1;
 112
 113        return 0;
 114}
 115
 116static int log_line_range_callback(const struct option *option, const char *arg, int unset)
 117{
 118        struct line_opt_callback_data *data = option->value;
 119
 120        BUG_ON_OPT_NEG(unset);
 121
 122        if (!arg)
 123                return -1;
 124
 125        data->rev->line_level_traverse = 1;
 126        string_list_append(&data->args, arg);
 127
 128        return 0;
 129}
 130
 131static void init_log_defaults(void)
 132{
 133        init_grep_defaults(the_repository);
 134        init_diff_ui_defaults();
 135
 136        decoration_style = auto_decoration_style();
 137}
 138
 139static void cmd_log_init_defaults(struct rev_info *rev)
 140{
 141        if (fmt_pretty)
 142                get_commit_format(fmt_pretty, rev);
 143        if (default_follow)
 144                rev->diffopt.flags.default_follow_renames = 1;
 145        rev->verbose_header = 1;
 146        rev->diffopt.flags.recursive = 1;
 147        rev->diffopt.stat_width = -1; /* use full terminal width */
 148        rev->diffopt.stat_graph_width = -1; /* respect statGraphWidth config */
 149        rev->abbrev_commit = default_abbrev_commit;
 150        rev->show_root_diff = default_show_root;
 151        rev->subject_prefix = fmt_patch_subject_prefix;
 152        rev->show_signature = default_show_signature;
 153        rev->diffopt.flags.allow_textconv = 1;
 154
 155        if (default_date_mode)
 156                parse_date_format(default_date_mode, &rev->date_mode);
 157}
 158
 159static char warn_unspecified_mailmap_msg[] =
 160N_("log.mailmap is not set; its implicit value will change in an\n"
 161   "upcoming release. To squelch this message and preserve current\n"
 162   "behaviour, set the log.mailmap configuration value to false.\n"
 163   "\n"
 164   "To squelch this message and adopt the new behaviour now, set the\n"
 165   "log.mailmap configuration value to true.\n"
 166   "\n"
 167   "See 'git help config' and search for 'log.mailmap' for further information.");
 168
 169static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 170                         struct rev_info *rev, struct setup_revision_opt *opt)
 171{
 172        struct userformat_want w;
 173        int quiet = 0, source = 0, mailmap = 0;
 174        static struct line_opt_callback_data line_cb = {NULL, NULL, STRING_LIST_INIT_DUP};
 175        static struct string_list decorate_refs_exclude = STRING_LIST_INIT_NODUP;
 176        static struct string_list decorate_refs_include = STRING_LIST_INIT_NODUP;
 177        struct decoration_filter decoration_filter = {&decorate_refs_include,
 178                                                      &decorate_refs_exclude};
 179        static struct revision_sources revision_sources;
 180
 181        const struct option builtin_log_options[] = {
 182                OPT__QUIET(&quiet, N_("suppress diff output")),
 183                OPT_BOOL(0, "source", &source, N_("show source")),
 184                OPT_BOOL(0, "use-mailmap", &mailmap, N_("Use mail map file")),
 185                OPT_STRING_LIST(0, "decorate-refs", &decorate_refs_include,
 186                                N_("pattern"), N_("only decorate refs that match <pattern>")),
 187                OPT_STRING_LIST(0, "decorate-refs-exclude", &decorate_refs_exclude,
 188                                N_("pattern"), N_("do not decorate refs that match <pattern>")),
 189                { OPTION_CALLBACK, 0, "decorate", NULL, NULL, N_("decorate options"),
 190                  PARSE_OPT_OPTARG, decorate_callback},
 191                OPT_CALLBACK('L', NULL, &line_cb, "n,m:file",
 192                             N_("Process line range n,m in file, counting from 1"),
 193                             log_line_range_callback),
 194                OPT_END()
 195        };
 196
 197        line_cb.rev = rev;
 198        line_cb.prefix = prefix;
 199
 200        mailmap = use_mailmap_config;
 201        argc = parse_options(argc, argv, prefix,
 202                             builtin_log_options, builtin_log_usage,
 203                             PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
 204                             PARSE_OPT_KEEP_DASHDASH);
 205
 206        if (quiet)
 207                rev->diffopt.output_format |= DIFF_FORMAT_NO_OUTPUT;
 208        argc = setup_revisions(argc, argv, rev, opt);
 209
 210        /* Any arguments at this point are not recognized */
 211        if (argc > 1)
 212                die(_("unrecognized argument: %s"), argv[1]);
 213
 214        memset(&w, 0, sizeof(w));
 215        userformat_find_requirements(NULL, &w);
 216
 217        if (mailmap < 0) {
 218                if (session_is_interactive() && !rev->pretty_given)
 219                        warning("%s\n", _(warn_unspecified_mailmap_msg));
 220
 221                mailmap = 0;
 222        }
 223
 224        if (!rev->show_notes_given && (!rev->pretty_given || w.notes))
 225                rev->show_notes = 1;
 226        if (rev->show_notes)
 227                init_display_notes(&rev->notes_opt);
 228
 229        if ((rev->diffopt.pickaxe_opts & DIFF_PICKAXE_KINDS_MASK) ||
 230            rev->diffopt.filter || rev->diffopt.flags.follow_renames)
 231                rev->always_show_header = 0;
 232
 233        if (source || w.source) {
 234                init_revision_sources(&revision_sources);
 235                rev->sources = &revision_sources;
 236        }
 237
 238        if (mailmap) {
 239                rev->mailmap = xcalloc(1, sizeof(struct string_list));
 240                read_mailmap(rev->mailmap, NULL);
 241        }
 242
 243        if (rev->pretty_given && rev->commit_format == CMIT_FMT_RAW) {
 244                /*
 245                 * "log --pretty=raw" is special; ignore UI oriented
 246                 * configuration variables such as decoration.
 247                 */
 248                if (!decoration_given)
 249                        decoration_style = 0;
 250                if (!rev->abbrev_commit_given)
 251                        rev->abbrev_commit = 0;
 252        }
 253
 254        if (decoration_style) {
 255                rev->show_decorations = 1;
 256                load_ref_decorations(&decoration_filter, decoration_style);
 257        }
 258
 259        if (rev->line_level_traverse)
 260                line_log_init(rev, line_cb.prefix, &line_cb.args);
 261
 262        setup_pager();
 263}
 264
 265static void cmd_log_init(int argc, const char **argv, const char *prefix,
 266                         struct rev_info *rev, struct setup_revision_opt *opt)
 267{
 268        cmd_log_init_defaults(rev);
 269        cmd_log_init_finish(argc, argv, prefix, rev, opt);
 270}
 271
 272/*
 273 * This gives a rough estimate for how many commits we
 274 * will print out in the list.
 275 */
 276static int estimate_commit_count(struct commit_list *list)
 277{
 278        int n = 0;
 279
 280        while (list) {
 281                struct commit *commit = list->item;
 282                unsigned int flags = commit->object.flags;
 283                list = list->next;
 284                if (!(flags & (TREESAME | UNINTERESTING)))
 285                        n++;
 286        }
 287        return n;
 288}
 289
 290static void show_early_header(struct rev_info *rev, const char *stage, int nr)
 291{
 292        if (rev->shown_one) {
 293                rev->shown_one = 0;
 294                if (rev->commit_format != CMIT_FMT_ONELINE)
 295                        putchar(rev->diffopt.line_termination);
 296        }
 297        fprintf(rev->diffopt.file, _("Final output: %d %s\n"), nr, stage);
 298}
 299
 300static struct itimerval early_output_timer;
 301
 302static void log_show_early(struct rev_info *revs, struct commit_list *list)
 303{
 304        int i = revs->early_output, close_file = revs->diffopt.close_file;
 305        int show_header = 1;
 306
 307        revs->diffopt.close_file = 0;
 308        sort_in_topological_order(&list, revs->sort_order);
 309        while (list && i) {
 310                struct commit *commit = list->item;
 311                switch (simplify_commit(revs, commit)) {
 312                case commit_show:
 313                        if (show_header) {
 314                                int n = estimate_commit_count(list);
 315                                show_early_header(revs, "incomplete", n);
 316                                show_header = 0;
 317                        }
 318                        log_tree_commit(revs, commit);
 319                        i--;
 320                        break;
 321                case commit_ignore:
 322                        break;
 323                case commit_error:
 324                        if (close_file)
 325                                fclose(revs->diffopt.file);
 326                        return;
 327                }
 328                list = list->next;
 329        }
 330
 331        /* Did we already get enough commits for the early output? */
 332        if (!i) {
 333                if (close_file)
 334                        fclose(revs->diffopt.file);
 335                return;
 336        }
 337
 338        /*
 339         * ..if no, then repeat it twice a second until we
 340         * do.
 341         *
 342         * NOTE! We don't use "it_interval", because if the
 343         * reader isn't listening, we want our output to be
 344         * throttled by the writing, and not have the timer
 345         * trigger every second even if we're blocked on a
 346         * reader!
 347         */
 348        early_output_timer.it_value.tv_sec = 0;
 349        early_output_timer.it_value.tv_usec = 500000;
 350        setitimer(ITIMER_REAL, &early_output_timer, NULL);
 351}
 352
 353static void early_output(int signal)
 354{
 355        show_early_output = log_show_early;
 356}
 357
 358static void setup_early_output(void)
 359{
 360        struct sigaction sa;
 361
 362        /*
 363         * Set up the signal handler, minimally intrusively:
 364         * we only set a single volatile integer word (not
 365         * using sigatomic_t - trying to avoid unnecessary
 366         * system dependencies and headers), and using
 367         * SA_RESTART.
 368         */
 369        memset(&sa, 0, sizeof(sa));
 370        sa.sa_handler = early_output;
 371        sigemptyset(&sa.sa_mask);
 372        sa.sa_flags = SA_RESTART;
 373        sigaction(SIGALRM, &sa, NULL);
 374
 375        /*
 376         * If we can get the whole output in less than a
 377         * tenth of a second, don't even bother doing the
 378         * early-output thing..
 379         *
 380         * This is a one-time-only trigger.
 381         */
 382        early_output_timer.it_value.tv_sec = 0;
 383        early_output_timer.it_value.tv_usec = 100000;
 384        setitimer(ITIMER_REAL, &early_output_timer, NULL);
 385}
 386
 387static void finish_early_output(struct rev_info *rev)
 388{
 389        int n = estimate_commit_count(rev->commits);
 390        signal(SIGALRM, SIG_IGN);
 391        show_early_header(rev, "done", n);
 392}
 393
 394static int cmd_log_walk(struct rev_info *rev)
 395{
 396        struct commit *commit;
 397        int saved_nrl = 0;
 398        int saved_dcctc = 0, close_file = rev->diffopt.close_file;
 399
 400        if (rev->early_output)
 401                setup_early_output();
 402
 403        if (prepare_revision_walk(rev))
 404                die(_("revision walk setup failed"));
 405
 406        if (rev->early_output)
 407                finish_early_output(rev);
 408
 409        /*
 410         * For --check and --exit-code, the exit code is based on CHECK_FAILED
 411         * and HAS_CHANGES being accumulated in rev->diffopt, so be careful to
 412         * retain that state information if replacing rev->diffopt in this loop
 413         */
 414        rev->diffopt.close_file = 0;
 415        while ((commit = get_revision(rev)) != NULL) {
 416                if (!log_tree_commit(rev, commit) && rev->max_count >= 0)
 417                        /*
 418                         * We decremented max_count in get_revision,
 419                         * but we didn't actually show the commit.
 420                         */
 421                        rev->max_count++;
 422                if (!rev->reflog_info) {
 423                        /*
 424                         * We may show a given commit multiple times when
 425                         * walking the reflogs.
 426                         */
 427                        free_commit_buffer(the_repository->parsed_objects,
 428                                           commit);
 429                        free_commit_list(commit->parents);
 430                        commit->parents = NULL;
 431                }
 432                if (saved_nrl < rev->diffopt.needed_rename_limit)
 433                        saved_nrl = rev->diffopt.needed_rename_limit;
 434                if (rev->diffopt.degraded_cc_to_c)
 435                        saved_dcctc = 1;
 436        }
 437        rev->diffopt.degraded_cc_to_c = saved_dcctc;
 438        rev->diffopt.needed_rename_limit = saved_nrl;
 439        if (close_file)
 440                fclose(rev->diffopt.file);
 441
 442        if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
 443            rev->diffopt.flags.check_failed) {
 444                return 02;
 445        }
 446        return diff_result_code(&rev->diffopt, 0);
 447}
 448
 449static int git_log_config(const char *var, const char *value, void *cb)
 450{
 451        const char *slot_name;
 452
 453        if (!strcmp(var, "format.pretty"))
 454                return git_config_string(&fmt_pretty, var, value);
 455        if (!strcmp(var, "format.subjectprefix"))
 456                return git_config_string(&fmt_patch_subject_prefix, var, value);
 457        if (!strcmp(var, "log.abbrevcommit")) {
 458                default_abbrev_commit = git_config_bool(var, value);
 459                return 0;
 460        }
 461        if (!strcmp(var, "log.date"))
 462                return git_config_string(&default_date_mode, var, value);
 463        if (!strcmp(var, "log.decorate")) {
 464                decoration_style = parse_decoration_style(value);
 465                if (decoration_style < 0)
 466                        decoration_style = 0; /* maybe warn? */
 467                return 0;
 468        }
 469        if (!strcmp(var, "log.showroot")) {
 470                default_show_root = git_config_bool(var, value);
 471                return 0;
 472        }
 473        if (!strcmp(var, "log.follow")) {
 474                default_follow = git_config_bool(var, value);
 475                return 0;
 476        }
 477        if (skip_prefix(var, "color.decorate.", &slot_name))
 478                return parse_decorate_color_config(var, slot_name, value);
 479        if (!strcmp(var, "log.mailmap")) {
 480                use_mailmap_config = git_config_bool(var, value);
 481                return 0;
 482        }
 483        if (!strcmp(var, "log.showsignature")) {
 484                default_show_signature = git_config_bool(var, value);
 485                return 0;
 486        }
 487
 488        if (grep_config(var, value, cb) < 0)
 489                return -1;
 490        if (git_gpg_config(var, value, cb) < 0)
 491                return -1;
 492        return git_diff_ui_config(var, value, cb);
 493}
 494
 495int cmd_whatchanged(int argc, const char **argv, const char *prefix)
 496{
 497        struct rev_info rev;
 498        struct setup_revision_opt opt;
 499
 500        init_log_defaults();
 501        git_config(git_log_config, NULL);
 502
 503        repo_init_revisions(the_repository, &rev, prefix);
 504        rev.diff = 1;
 505        rev.simplify_history = 0;
 506        memset(&opt, 0, sizeof(opt));
 507        opt.def = "HEAD";
 508        opt.revarg_opt = REVARG_COMMITTISH;
 509        cmd_log_init(argc, argv, prefix, &rev, &opt);
 510        if (!rev.diffopt.output_format)
 511                rev.diffopt.output_format = DIFF_FORMAT_RAW;
 512        return cmd_log_walk(&rev);
 513}
 514
 515static void show_tagger(const char *buf, struct rev_info *rev)
 516{
 517        struct strbuf out = STRBUF_INIT;
 518        struct pretty_print_context pp = {0};
 519
 520        pp.fmt = rev->commit_format;
 521        pp.date_mode = rev->date_mode;
 522        pp_user_info(&pp, "Tagger", &out, buf, get_log_output_encoding());
 523        fprintf(rev->diffopt.file, "%s", out.buf);
 524        strbuf_release(&out);
 525}
 526
 527static int show_blob_object(const struct object_id *oid, struct rev_info *rev, const char *obj_name)
 528{
 529        struct object_id oidc;
 530        struct object_context obj_context;
 531        char *buf;
 532        unsigned long size;
 533
 534        fflush(rev->diffopt.file);
 535        if (!rev->diffopt.flags.textconv_set_via_cmdline ||
 536            !rev->diffopt.flags.allow_textconv)
 537                return stream_blob_to_fd(1, oid, NULL, 0);
 538
 539        if (get_oid_with_context(the_repository, obj_name,
 540                                 GET_OID_RECORD_PATH,
 541                                 &oidc, &obj_context))
 542                die(_("not a valid object name %s"), obj_name);
 543        if (!obj_context.path ||
 544            !textconv_object(the_repository, obj_context.path,
 545                             obj_context.mode, &oidc, 1, &buf, &size)) {
 546                free(obj_context.path);
 547                return stream_blob_to_fd(1, oid, NULL, 0);
 548        }
 549
 550        if (!buf)
 551                die(_("git show %s: bad file"), obj_name);
 552
 553        write_or_die(1, buf, size);
 554        free(obj_context.path);
 555        return 0;
 556}
 557
 558static int show_tag_object(const struct object_id *oid, struct rev_info *rev)
 559{
 560        unsigned long size;
 561        enum object_type type;
 562        char *buf = read_object_file(oid, &type, &size);
 563        int offset = 0;
 564
 565        if (!buf)
 566                return error(_("could not read object %s"), oid_to_hex(oid));
 567
 568        assert(type == OBJ_TAG);
 569        while (offset < size && buf[offset] != '\n') {
 570                int new_offset = offset + 1;
 571                const char *ident;
 572                while (new_offset < size && buf[new_offset++] != '\n')
 573                        ; /* do nothing */
 574                if (skip_prefix(buf + offset, "tagger ", &ident))
 575                        show_tagger(ident, rev);
 576                offset = new_offset;
 577        }
 578
 579        if (offset < size)
 580                fwrite(buf + offset, size - offset, 1, rev->diffopt.file);
 581        free(buf);
 582        return 0;
 583}
 584
 585static int show_tree_object(const struct object_id *oid,
 586                struct strbuf *base,
 587                const char *pathname, unsigned mode, int stage, void *context)
 588{
 589        FILE *file = context;
 590        fprintf(file, "%s%s\n", pathname, S_ISDIR(mode) ? "/" : "");
 591        return 0;
 592}
 593
 594static void show_setup_revisions_tweak(struct rev_info *rev,
 595                                       struct setup_revision_opt *opt)
 596{
 597        if (rev->ignore_merges) {
 598                /* There was no "-m" on the command line */
 599                rev->ignore_merges = 0;
 600                if (!rev->first_parent_only && !rev->combine_merges) {
 601                        /* No "--first-parent", "-c", or "--cc" */
 602                        rev->combine_merges = 1;
 603                        rev->dense_combined_merges = 1;
 604                }
 605        }
 606        if (!rev->diffopt.output_format)
 607                rev->diffopt.output_format = DIFF_FORMAT_PATCH;
 608}
 609
 610int cmd_show(int argc, const char **argv, const char *prefix)
 611{
 612        struct rev_info rev;
 613        struct object_array_entry *objects;
 614        struct setup_revision_opt opt;
 615        struct pathspec match_all;
 616        int i, count, ret = 0;
 617
 618        init_log_defaults();
 619        git_config(git_log_config, NULL);
 620
 621        memset(&match_all, 0, sizeof(match_all));
 622        repo_init_revisions(the_repository, &rev, prefix);
 623        rev.diff = 1;
 624        rev.always_show_header = 1;
 625        rev.no_walk = REVISION_WALK_NO_WALK_SORTED;
 626        rev.diffopt.stat_width = -1;    /* Scale to real terminal size */
 627
 628        memset(&opt, 0, sizeof(opt));
 629        opt.def = "HEAD";
 630        opt.tweak = show_setup_revisions_tweak;
 631        cmd_log_init(argc, argv, prefix, &rev, &opt);
 632
 633        if (!rev.no_walk)
 634                return cmd_log_walk(&rev);
 635
 636        count = rev.pending.nr;
 637        objects = rev.pending.objects;
 638        for (i = 0; i < count && !ret; i++) {
 639                struct object *o = objects[i].item;
 640                const char *name = objects[i].name;
 641                switch (o->type) {
 642                case OBJ_BLOB:
 643                        ret = show_blob_object(&o->oid, &rev, name);
 644                        break;
 645                case OBJ_TAG: {
 646                        struct tag *t = (struct tag *)o;
 647
 648                        if (rev.shown_one)
 649                                putchar('\n');
 650                        fprintf(rev.diffopt.file, "%stag %s%s\n",
 651                                        diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
 652                                        t->tag,
 653                                        diff_get_color_opt(&rev.diffopt, DIFF_RESET));
 654                        ret = show_tag_object(&o->oid, &rev);
 655                        rev.shown_one = 1;
 656                        if (ret)
 657                                break;
 658                        o = parse_object(the_repository, &t->tagged->oid);
 659                        if (!o)
 660                                ret = error(_("could not read object %s"),
 661                                            oid_to_hex(&t->tagged->oid));
 662                        objects[i].item = o;
 663                        i--;
 664                        break;
 665                }
 666                case OBJ_TREE:
 667                        if (rev.shown_one)
 668                                putchar('\n');
 669                        fprintf(rev.diffopt.file, "%stree %s%s\n\n",
 670                                        diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
 671                                        name,
 672                                        diff_get_color_opt(&rev.diffopt, DIFF_RESET));
 673                        read_tree_recursive(the_repository, (struct tree *)o, "",
 674                                            0, 0, &match_all, show_tree_object,
 675                                            rev.diffopt.file);
 676                        rev.shown_one = 1;
 677                        break;
 678                case OBJ_COMMIT:
 679                        rev.pending.nr = rev.pending.alloc = 0;
 680                        rev.pending.objects = NULL;
 681                        add_object_array(o, name, &rev.pending);
 682                        ret = cmd_log_walk(&rev);
 683                        break;
 684                default:
 685                        ret = error(_("unknown type: %d"), o->type);
 686                }
 687        }
 688        free(objects);
 689        return ret;
 690}
 691
 692/*
 693 * This is equivalent to "git log -g --abbrev-commit --pretty=oneline"
 694 */
 695int cmd_log_reflog(int argc, const char **argv, const char *prefix)
 696{
 697        struct rev_info rev;
 698        struct setup_revision_opt opt;
 699
 700        init_log_defaults();
 701        git_config(git_log_config, NULL);
 702
 703        repo_init_revisions(the_repository, &rev, prefix);
 704        init_reflog_walk(&rev.reflog_info);
 705        rev.verbose_header = 1;
 706        memset(&opt, 0, sizeof(opt));
 707        opt.def = "HEAD";
 708        cmd_log_init_defaults(&rev);
 709        rev.abbrev_commit = 1;
 710        rev.commit_format = CMIT_FMT_ONELINE;
 711        rev.use_terminator = 1;
 712        rev.always_show_header = 1;
 713        cmd_log_init_finish(argc, argv, prefix, &rev, &opt);
 714
 715        return cmd_log_walk(&rev);
 716}
 717
 718static void log_setup_revisions_tweak(struct rev_info *rev,
 719                                      struct setup_revision_opt *opt)
 720{
 721        if (rev->diffopt.flags.default_follow_renames &&
 722            rev->prune_data.nr == 1)
 723                rev->diffopt.flags.follow_renames = 1;
 724
 725        /* Turn --cc/-c into -p --cc/-c when -p was not given */
 726        if (!rev->diffopt.output_format && rev->combine_merges)
 727                rev->diffopt.output_format = DIFF_FORMAT_PATCH;
 728
 729        /* Turn -m on when --cc/-c was given */
 730        if (rev->combine_merges)
 731                rev->ignore_merges = 0;
 732}
 733
 734int cmd_log(int argc, const char **argv, const char *prefix)
 735{
 736        struct rev_info rev;
 737        struct setup_revision_opt opt;
 738
 739        init_log_defaults();
 740        git_config(git_log_config, NULL);
 741
 742        repo_init_revisions(the_repository, &rev, prefix);
 743        rev.always_show_header = 1;
 744        memset(&opt, 0, sizeof(opt));
 745        opt.def = "HEAD";
 746        opt.revarg_opt = REVARG_COMMITTISH;
 747        opt.tweak = log_setup_revisions_tweak;
 748        cmd_log_init(argc, argv, prefix, &rev, &opt);
 749        return cmd_log_walk(&rev);
 750}
 751
 752/* format-patch */
 753
 754static const char *fmt_patch_suffix = ".patch";
 755static int numbered = 0;
 756static int auto_number = 1;
 757
 758static char *default_attach = NULL;
 759
 760static struct string_list extra_hdr = STRING_LIST_INIT_NODUP;
 761static struct string_list extra_to = STRING_LIST_INIT_NODUP;
 762static struct string_list extra_cc = STRING_LIST_INIT_NODUP;
 763
 764static void add_header(const char *value)
 765{
 766        struct string_list_item *item;
 767        int len = strlen(value);
 768        while (len && value[len - 1] == '\n')
 769                len--;
 770
 771        if (!strncasecmp(value, "to: ", 4)) {
 772                item = string_list_append(&extra_to, value + 4);
 773                len -= 4;
 774        } else if (!strncasecmp(value, "cc: ", 4)) {
 775                item = string_list_append(&extra_cc, value + 4);
 776                len -= 4;
 777        } else {
 778                item = string_list_append(&extra_hdr, value);
 779        }
 780
 781        item->string[len] = '\0';
 782}
 783
 784#define THREAD_SHALLOW 1
 785#define THREAD_DEEP 2
 786static int thread;
 787static int do_signoff;
 788static int base_auto;
 789static char *from;
 790static const char *signature = git_version_string;
 791static const char *signature_file;
 792static int config_cover_letter;
 793static const char *config_output_directory;
 794
 795enum {
 796        COVER_UNSET,
 797        COVER_OFF,
 798        COVER_ON,
 799        COVER_AUTO
 800};
 801
 802static int git_format_config(const char *var, const char *value, void *cb)
 803{
 804        struct rev_info *rev = cb;
 805
 806        if (!strcmp(var, "format.headers")) {
 807                if (!value)
 808                        die(_("format.headers without value"));
 809                add_header(value);
 810                return 0;
 811        }
 812        if (!strcmp(var, "format.suffix"))
 813                return git_config_string(&fmt_patch_suffix, var, value);
 814        if (!strcmp(var, "format.to")) {
 815                if (!value)
 816                        return config_error_nonbool(var);
 817                string_list_append(&extra_to, value);
 818                return 0;
 819        }
 820        if (!strcmp(var, "format.cc")) {
 821                if (!value)
 822                        return config_error_nonbool(var);
 823                string_list_append(&extra_cc, value);
 824                return 0;
 825        }
 826        if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff") ||
 827            !strcmp(var, "color.ui") || !strcmp(var, "diff.submodule")) {
 828                return 0;
 829        }
 830        if (!strcmp(var, "format.numbered")) {
 831                if (value && !strcasecmp(value, "auto")) {
 832                        auto_number = 1;
 833                        return 0;
 834                }
 835                numbered = git_config_bool(var, value);
 836                auto_number = auto_number && numbered;
 837                return 0;
 838        }
 839        if (!strcmp(var, "format.attach")) {
 840                if (value && *value)
 841                        default_attach = xstrdup(value);
 842                else
 843                        default_attach = xstrdup(git_version_string);
 844                return 0;
 845        }
 846        if (!strcmp(var, "format.thread")) {
 847                if (value && !strcasecmp(value, "deep")) {
 848                        thread = THREAD_DEEP;
 849                        return 0;
 850                }
 851                if (value && !strcasecmp(value, "shallow")) {
 852                        thread = THREAD_SHALLOW;
 853                        return 0;
 854                }
 855                thread = git_config_bool(var, value) && THREAD_SHALLOW;
 856                return 0;
 857        }
 858        if (!strcmp(var, "format.signoff")) {
 859                do_signoff = git_config_bool(var, value);
 860                return 0;
 861        }
 862        if (!strcmp(var, "format.signature"))
 863                return git_config_string(&signature, var, value);
 864        if (!strcmp(var, "format.signaturefile"))
 865                return git_config_pathname(&signature_file, var, value);
 866        if (!strcmp(var, "format.coverletter")) {
 867                if (value && !strcasecmp(value, "auto")) {
 868                        config_cover_letter = COVER_AUTO;
 869                        return 0;
 870                }
 871                config_cover_letter = git_config_bool(var, value) ? COVER_ON : COVER_OFF;
 872                return 0;
 873        }
 874        if (!strcmp(var, "format.outputdirectory"))
 875                return git_config_string(&config_output_directory, var, value);
 876        if (!strcmp(var, "format.useautobase")) {
 877                base_auto = git_config_bool(var, value);
 878                return 0;
 879        }
 880        if (!strcmp(var, "format.from")) {
 881                int b = git_parse_maybe_bool(value);
 882                free(from);
 883                if (b < 0)
 884                        from = xstrdup(value);
 885                else if (b)
 886                        from = xstrdup(git_committer_info(IDENT_NO_DATE));
 887                else
 888                        from = NULL;
 889                return 0;
 890        }
 891        if (!strcmp(var, "format.notes")) {
 892                struct strbuf buf = STRBUF_INIT;
 893                int b = git_parse_maybe_bool(value);
 894                if (!b)
 895                        return 0;
 896                rev->show_notes = 1;
 897                if (b < 0) {
 898                        strbuf_addstr(&buf, value);
 899                        expand_notes_ref(&buf);
 900                        string_list_append(&rev->notes_opt.extra_notes_refs,
 901                                        strbuf_detach(&buf, NULL));
 902                } else {
 903                        rev->notes_opt.use_default_notes = 1;
 904                }
 905                return 0;
 906        }
 907
 908        return git_log_config(var, value, cb);
 909}
 910
 911static const char *output_directory = NULL;
 912static int outdir_offset;
 913
 914static int open_next_file(struct commit *commit, const char *subject,
 915                         struct rev_info *rev, int quiet)
 916{
 917        struct strbuf filename = STRBUF_INIT;
 918        int suffix_len = strlen(rev->patch_suffix) + 1;
 919
 920        if (output_directory) {
 921                strbuf_addstr(&filename, output_directory);
 922                if (filename.len >=
 923                    PATH_MAX - FORMAT_PATCH_NAME_MAX - suffix_len) {
 924                        strbuf_release(&filename);
 925                        return error(_("name of output directory is too long"));
 926                }
 927                strbuf_complete(&filename, '/');
 928        }
 929
 930        if (rev->numbered_files)
 931                strbuf_addf(&filename, "%d", rev->nr);
 932        else if (commit)
 933                fmt_output_commit(&filename, commit, rev);
 934        else
 935                fmt_output_subject(&filename, subject, rev);
 936
 937        if (!quiet)
 938                printf("%s\n", filename.buf + outdir_offset);
 939
 940        if ((rev->diffopt.file = fopen(filename.buf, "w")) == NULL) {
 941                error_errno(_("cannot open patch file %s"), filename.buf);
 942                strbuf_release(&filename);
 943                return -1;
 944        }
 945
 946        strbuf_release(&filename);
 947        return 0;
 948}
 949
 950static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)
 951{
 952        struct rev_info check_rev;
 953        struct commit *commit, *c1, *c2;
 954        struct object *o1, *o2;
 955        unsigned flags1, flags2;
 956
 957        if (rev->pending.nr != 2)
 958                die(_("need exactly one range"));
 959
 960        o1 = rev->pending.objects[0].item;
 961        o2 = rev->pending.objects[1].item;
 962        flags1 = o1->flags;
 963        flags2 = o2->flags;
 964        c1 = lookup_commit_reference(the_repository, &o1->oid);
 965        c2 = lookup_commit_reference(the_repository, &o2->oid);
 966
 967        if ((flags1 & UNINTERESTING) == (flags2 & UNINTERESTING))
 968                die(_("not a range"));
 969
 970        init_patch_ids(the_repository, ids);
 971
 972        /* given a range a..b get all patch ids for b..a */
 973        repo_init_revisions(the_repository, &check_rev, rev->prefix);
 974        check_rev.max_parents = 1;
 975        o1->flags ^= UNINTERESTING;
 976        o2->flags ^= UNINTERESTING;
 977        add_pending_object(&check_rev, o1, "o1");
 978        add_pending_object(&check_rev, o2, "o2");
 979        if (prepare_revision_walk(&check_rev))
 980                die(_("revision walk setup failed"));
 981
 982        while ((commit = get_revision(&check_rev)) != NULL) {
 983                add_commit_patch_id(commit, ids);
 984        }
 985
 986        /* reset for next revision walk */
 987        clear_commit_marks(c1, SEEN | UNINTERESTING | SHOWN | ADDED);
 988        clear_commit_marks(c2, SEEN | UNINTERESTING | SHOWN | ADDED);
 989        o1->flags = flags1;
 990        o2->flags = flags2;
 991}
 992
 993static void gen_message_id(struct rev_info *info, char *base)
 994{
 995        struct strbuf buf = STRBUF_INIT;
 996        strbuf_addf(&buf, "%s.%"PRItime".git.%s", base,
 997                    (timestamp_t) time(NULL),
 998                    git_committer_info(IDENT_NO_NAME|IDENT_NO_DATE|IDENT_STRICT));
 999        info->message_id = strbuf_detach(&buf, NULL);
1000}
1001
1002static void print_signature(FILE *file)
1003{
1004        if (!signature || !*signature)
1005                return;
1006
1007        fprintf(file, "-- \n%s", signature);
1008        if (signature[strlen(signature)-1] != '\n')
1009                putc('\n', file);
1010        putc('\n', file);
1011}
1012
1013static void add_branch_description(struct strbuf *buf, const char *branch_name)
1014{
1015        struct strbuf desc = STRBUF_INIT;
1016        if (!branch_name || !*branch_name)
1017                return;
1018        read_branch_desc(&desc, branch_name);
1019        if (desc.len) {
1020                strbuf_addch(buf, '\n');
1021                strbuf_addbuf(buf, &desc);
1022                strbuf_addch(buf, '\n');
1023        }
1024        strbuf_release(&desc);
1025}
1026
1027static char *find_branch_name(struct rev_info *rev)
1028{
1029        int i, positive = -1;
1030        struct object_id branch_oid;
1031        const struct object_id *tip_oid;
1032        const char *ref, *v;
1033        char *full_ref, *branch = NULL;
1034
1035        for (i = 0; i < rev->cmdline.nr; i++) {
1036                if (rev->cmdline.rev[i].flags & UNINTERESTING)
1037                        continue;
1038                if (positive < 0)
1039                        positive = i;
1040                else
1041                        return NULL;
1042        }
1043        if (positive < 0)
1044                return NULL;
1045        ref = rev->cmdline.rev[positive].name;
1046        tip_oid = &rev->cmdline.rev[positive].item->oid;
1047        if (dwim_ref(ref, strlen(ref), &branch_oid, &full_ref) &&
1048            skip_prefix(full_ref, "refs/heads/", &v) &&
1049            oideq(tip_oid, &branch_oid))
1050                branch = xstrdup(v);
1051        free(full_ref);
1052        return branch;
1053}
1054
1055static void show_diffstat(struct rev_info *rev,
1056                          struct commit *origin, struct commit *head)
1057{
1058        struct diff_options opts;
1059
1060        memcpy(&opts, &rev->diffopt, sizeof(opts));
1061        opts.output_format = DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
1062        diff_setup_done(&opts);
1063
1064        diff_tree_oid(get_commit_tree_oid(origin),
1065                      get_commit_tree_oid(head),
1066                      "", &opts);
1067        diffcore_std(&opts);
1068        diff_flush(&opts);
1069
1070        fprintf(rev->diffopt.file, "\n");
1071}
1072
1073static void make_cover_letter(struct rev_info *rev, int use_stdout,
1074                              struct commit *origin,
1075                              int nr, struct commit **list,
1076                              const char *branch_name,
1077                              int quiet)
1078{
1079        const char *committer;
1080        const char *body = "*** SUBJECT HERE ***\n\n*** BLURB HERE ***\n";
1081        const char *msg;
1082        struct shortlog log;
1083        struct strbuf sb = STRBUF_INIT;
1084        int i;
1085        const char *encoding = "UTF-8";
1086        int need_8bit_cte = 0;
1087        struct pretty_print_context pp = {0};
1088        struct commit *head = list[0];
1089
1090        if (!cmit_fmt_is_mail(rev->commit_format))
1091                die(_("cover letter needs email format"));
1092
1093        committer = git_committer_info(0);
1094
1095        if (!use_stdout &&
1096            open_next_file(NULL, rev->numbered_files ? NULL : "cover-letter", rev, quiet))
1097                die(_("failed to create cover-letter file"));
1098
1099        log_write_email_headers(rev, head, &pp.after_subject, &need_8bit_cte, 0);
1100
1101        for (i = 0; !need_8bit_cte && i < nr; i++) {
1102                const char *buf = get_commit_buffer(list[i], NULL);
1103                if (has_non_ascii(buf))
1104                        need_8bit_cte = 1;
1105                unuse_commit_buffer(list[i], buf);
1106        }
1107
1108        if (!branch_name)
1109                branch_name = find_branch_name(rev);
1110
1111        msg = body;
1112        pp.fmt = CMIT_FMT_EMAIL;
1113        pp.date_mode.type = DATE_RFC2822;
1114        pp.rev = rev;
1115        pp.print_email_subject = 1;
1116        pp_user_info(&pp, NULL, &sb, committer, encoding);
1117        pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte);
1118        pp_remainder(&pp, &msg, &sb, 0);
1119        add_branch_description(&sb, branch_name);
1120        fprintf(rev->diffopt.file, "%s\n", sb.buf);
1121
1122        strbuf_release(&sb);
1123
1124        shortlog_init(&log);
1125        log.wrap_lines = 1;
1126        log.wrap = MAIL_DEFAULT_WRAP;
1127        log.in1 = 2;
1128        log.in2 = 4;
1129        log.file = rev->diffopt.file;
1130        for (i = 0; i < nr; i++)
1131                shortlog_add_commit(&log, list[i]);
1132
1133        shortlog_output(&log);
1134
1135        /* We can only do diffstat with a unique reference point */
1136        if (origin)
1137                show_diffstat(rev, origin, head);
1138
1139        if (rev->idiff_oid1) {
1140                fprintf_ln(rev->diffopt.file, "%s", rev->idiff_title);
1141                show_interdiff(rev, 0);
1142        }
1143
1144        if (rev->rdiff1) {
1145                /*
1146                 * Pass minimum required diff-options to range-diff; others
1147                 * can be added later if deemed desirable.
1148                 */
1149                struct diff_options opts;
1150                diff_setup(&opts);
1151                opts.file = rev->diffopt.file;
1152                opts.use_color = rev->diffopt.use_color;
1153                diff_setup_done(&opts);
1154                fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title);
1155                show_range_diff(rev->rdiff1, rev->rdiff2,
1156                                rev->creation_factor, 1, &opts);
1157        }
1158}
1159
1160static const char *clean_message_id(const char *msg_id)
1161{
1162        char ch;
1163        const char *a, *z, *m;
1164
1165        m = msg_id;
1166        while ((ch = *m) && (isspace(ch) || (ch == '<')))
1167                m++;
1168        a = m;
1169        z = NULL;
1170        while ((ch = *m)) {
1171                if (!isspace(ch) && (ch != '>'))
1172                        z = m;
1173                m++;
1174        }
1175        if (!z)
1176                die(_("insane in-reply-to: %s"), msg_id);
1177        if (++z == m)
1178                return a;
1179        return xmemdupz(a, z - a);
1180}
1181
1182static const char *set_outdir(const char *prefix, const char *output_directory)
1183{
1184        if (output_directory && is_absolute_path(output_directory))
1185                return output_directory;
1186
1187        if (!prefix || !*prefix) {
1188                if (output_directory)
1189                        return output_directory;
1190                /* The user did not explicitly ask for "./" */
1191                outdir_offset = 2;
1192                return "./";
1193        }
1194
1195        outdir_offset = strlen(prefix);
1196        if (!output_directory)
1197                return prefix;
1198
1199        return prefix_filename(prefix, output_directory);
1200}
1201
1202static const char * const builtin_format_patch_usage[] = {
1203        N_("git format-patch [<options>] [<since> | <revision-range>]"),
1204        NULL
1205};
1206
1207static int keep_subject = 0;
1208
1209static int keep_callback(const struct option *opt, const char *arg, int unset)
1210{
1211        BUG_ON_OPT_NEG(unset);
1212        BUG_ON_OPT_ARG(arg);
1213        ((struct rev_info *)opt->value)->total = -1;
1214        keep_subject = 1;
1215        return 0;
1216}
1217
1218static int subject_prefix = 0;
1219
1220static int subject_prefix_callback(const struct option *opt, const char *arg,
1221                            int unset)
1222{
1223        BUG_ON_OPT_NEG(unset);
1224        subject_prefix = 1;
1225        ((struct rev_info *)opt->value)->subject_prefix = arg;
1226        return 0;
1227}
1228
1229static int rfc_callback(const struct option *opt, const char *arg, int unset)
1230{
1231        BUG_ON_OPT_NEG(unset);
1232        BUG_ON_OPT_ARG(arg);
1233        return subject_prefix_callback(opt, "RFC PATCH", unset);
1234}
1235
1236static int numbered_cmdline_opt = 0;
1237
1238static int numbered_callback(const struct option *opt, const char *arg,
1239                             int unset)
1240{
1241        BUG_ON_OPT_ARG(arg);
1242        *(int *)opt->value = numbered_cmdline_opt = unset ? 0 : 1;
1243        if (unset)
1244                auto_number =  0;
1245        return 0;
1246}
1247
1248static int no_numbered_callback(const struct option *opt, const char *arg,
1249                                int unset)
1250{
1251        BUG_ON_OPT_NEG(unset);
1252        return numbered_callback(opt, arg, 1);
1253}
1254
1255static int output_directory_callback(const struct option *opt, const char *arg,
1256                              int unset)
1257{
1258        const char **dir = (const char **)opt->value;
1259        BUG_ON_OPT_NEG(unset);
1260        if (*dir)
1261                die(_("two output directories?"));
1262        *dir = arg;
1263        return 0;
1264}
1265
1266static int thread_callback(const struct option *opt, const char *arg, int unset)
1267{
1268        int *thread = (int *)opt->value;
1269        if (unset)
1270                *thread = 0;
1271        else if (!arg || !strcmp(arg, "shallow"))
1272                *thread = THREAD_SHALLOW;
1273        else if (!strcmp(arg, "deep"))
1274                *thread = THREAD_DEEP;
1275        /*
1276         * Please update _git_formatpatch() in git-completion.bash
1277         * when you add new options.
1278         */
1279        else
1280                return 1;
1281        return 0;
1282}
1283
1284static int attach_callback(const struct option *opt, const char *arg, int unset)
1285{
1286        struct rev_info *rev = (struct rev_info *)opt->value;
1287        if (unset)
1288                rev->mime_boundary = NULL;
1289        else if (arg)
1290                rev->mime_boundary = arg;
1291        else
1292                rev->mime_boundary = git_version_string;
1293        rev->no_inline = unset ? 0 : 1;
1294        return 0;
1295}
1296
1297static int inline_callback(const struct option *opt, const char *arg, int unset)
1298{
1299        struct rev_info *rev = (struct rev_info *)opt->value;
1300        if (unset)
1301                rev->mime_boundary = NULL;
1302        else if (arg)
1303                rev->mime_boundary = arg;
1304        else
1305                rev->mime_boundary = git_version_string;
1306        rev->no_inline = 0;
1307        return 0;
1308}
1309
1310static int header_callback(const struct option *opt, const char *arg, int unset)
1311{
1312        if (unset) {
1313                string_list_clear(&extra_hdr, 0);
1314                string_list_clear(&extra_to, 0);
1315                string_list_clear(&extra_cc, 0);
1316        } else {
1317            add_header(arg);
1318        }
1319        return 0;
1320}
1321
1322static int to_callback(const struct option *opt, const char *arg, int unset)
1323{
1324        if (unset)
1325                string_list_clear(&extra_to, 0);
1326        else
1327                string_list_append(&extra_to, arg);
1328        return 0;
1329}
1330
1331static int cc_callback(const struct option *opt, const char *arg, int unset)
1332{
1333        if (unset)
1334                string_list_clear(&extra_cc, 0);
1335        else
1336                string_list_append(&extra_cc, arg);
1337        return 0;
1338}
1339
1340static int from_callback(const struct option *opt, const char *arg, int unset)
1341{
1342        char **from = opt->value;
1343
1344        free(*from);
1345
1346        if (unset)
1347                *from = NULL;
1348        else if (arg)
1349                *from = xstrdup(arg);
1350        else
1351                *from = xstrdup(git_committer_info(IDENT_NO_DATE));
1352        return 0;
1353}
1354
1355struct base_tree_info {
1356        struct object_id base_commit;
1357        int nr_patch_id, alloc_patch_id;
1358        struct object_id *patch_id;
1359};
1360
1361static struct commit *get_base_commit(const char *base_commit,
1362                                      struct commit **list,
1363                                      int total)
1364{
1365        struct commit *base = NULL;
1366        struct commit **rev;
1367        int i = 0, rev_nr = 0;
1368
1369        if (base_commit && strcmp(base_commit, "auto")) {
1370                base = lookup_commit_reference_by_name(base_commit);
1371                if (!base)
1372                        die(_("unknown commit %s"), base_commit);
1373        } else if ((base_commit && !strcmp(base_commit, "auto")) || base_auto) {
1374                struct branch *curr_branch = branch_get(NULL);
1375                const char *upstream = branch_get_upstream(curr_branch, NULL);
1376                if (upstream) {
1377                        struct commit_list *base_list;
1378                        struct commit *commit;
1379                        struct object_id oid;
1380
1381                        if (get_oid(upstream, &oid))
1382                                die(_("failed to resolve '%s' as a valid ref"), upstream);
1383                        commit = lookup_commit_or_die(&oid, "upstream base");
1384                        base_list = get_merge_bases_many(commit, total, list);
1385                        /* There should be one and only one merge base. */
1386                        if (!base_list || base_list->next)
1387                                die(_("could not find exact merge base"));
1388                        base = base_list->item;
1389                        free_commit_list(base_list);
1390                } else {
1391                        die(_("failed to get upstream, if you want to record base commit automatically,\n"
1392                              "please use git branch --set-upstream-to to track a remote branch.\n"
1393                              "Or you could specify base commit by --base=<base-commit-id> manually"));
1394                }
1395        }
1396
1397        ALLOC_ARRAY(rev, total);
1398        for (i = 0; i < total; i++)
1399                rev[i] = list[i];
1400
1401        rev_nr = total;
1402        /*
1403         * Get merge base through pair-wise computations
1404         * and store it in rev[0].
1405         */
1406        while (rev_nr > 1) {
1407                for (i = 0; i < rev_nr / 2; i++) {
1408                        struct commit_list *merge_base;
1409                        merge_base = get_merge_bases(rev[2 * i], rev[2 * i + 1]);
1410                        if (!merge_base || merge_base->next)
1411                                die(_("failed to find exact merge base"));
1412
1413                        rev[i] = merge_base->item;
1414                }
1415
1416                if (rev_nr % 2)
1417                        rev[i] = rev[2 * i];
1418                rev_nr = DIV_ROUND_UP(rev_nr, 2);
1419        }
1420
1421        if (!in_merge_bases(base, rev[0]))
1422                die(_("base commit should be the ancestor of revision list"));
1423
1424        for (i = 0; i < total; i++) {
1425                if (base == list[i])
1426                        die(_("base commit shouldn't be in revision list"));
1427        }
1428
1429        free(rev);
1430        return base;
1431}
1432
1433define_commit_slab(commit_base, int);
1434
1435static void prepare_bases(struct base_tree_info *bases,
1436                          struct commit *base,
1437                          struct commit **list,
1438                          int total)
1439{
1440        struct commit *commit;
1441        struct rev_info revs;
1442        struct diff_options diffopt;
1443        struct commit_base commit_base;
1444        int i;
1445
1446        if (!base)
1447                return;
1448
1449        init_commit_base(&commit_base);
1450        repo_diff_setup(the_repository, &diffopt);
1451        diffopt.flags.recursive = 1;
1452        diff_setup_done(&diffopt);
1453
1454        oidcpy(&bases->base_commit, &base->object.oid);
1455
1456        repo_init_revisions(the_repository, &revs, NULL);
1457        revs.max_parents = 1;
1458        revs.topo_order = 1;
1459        for (i = 0; i < total; i++) {
1460                list[i]->object.flags &= ~UNINTERESTING;
1461                add_pending_object(&revs, &list[i]->object, "rev_list");
1462                *commit_base_at(&commit_base, list[i]) = 1;
1463        }
1464        base->object.flags |= UNINTERESTING;
1465        add_pending_object(&revs, &base->object, "base");
1466
1467        if (prepare_revision_walk(&revs))
1468                die(_("revision walk setup failed"));
1469        /*
1470         * Traverse the commits list, get prerequisite patch ids
1471         * and stuff them in bases structure.
1472         */
1473        while ((commit = get_revision(&revs)) != NULL) {
1474                struct object_id oid;
1475                struct object_id *patch_id;
1476                if (*commit_base_at(&commit_base, commit))
1477                        continue;
1478                if (commit_patch_id(commit, &diffopt, &oid, 0, 1))
1479                        die(_("cannot get patch id"));
1480                ALLOC_GROW(bases->patch_id, bases->nr_patch_id + 1, bases->alloc_patch_id);
1481                patch_id = bases->patch_id + bases->nr_patch_id;
1482                oidcpy(patch_id, &oid);
1483                bases->nr_patch_id++;
1484        }
1485        clear_commit_base(&commit_base);
1486}
1487
1488static void print_bases(struct base_tree_info *bases, FILE *file)
1489{
1490        int i;
1491
1492        /* Only do this once, either for the cover or for the first one */
1493        if (is_null_oid(&bases->base_commit))
1494                return;
1495
1496        /* Show the base commit */
1497        fprintf(file, "\nbase-commit: %s\n", oid_to_hex(&bases->base_commit));
1498
1499        /* Show the prerequisite patches */
1500        for (i = bases->nr_patch_id - 1; i >= 0; i--)
1501                fprintf(file, "prerequisite-patch-id: %s\n", oid_to_hex(&bases->patch_id[i]));
1502
1503        free(bases->patch_id);
1504        bases->nr_patch_id = 0;
1505        bases->alloc_patch_id = 0;
1506        oidclr(&bases->base_commit);
1507}
1508
1509static const char *diff_title(struct strbuf *sb, int reroll_count,
1510                       const char *generic, const char *rerolled)
1511{
1512        if (reroll_count <= 0)
1513                strbuf_addstr(sb, generic);
1514        else /* RFC may be v0, so allow -v1 to diff against v0 */
1515                strbuf_addf(sb, rerolled, reroll_count - 1);
1516        return sb->buf;
1517}
1518
1519static void infer_range_diff_ranges(struct strbuf *r1,
1520                                    struct strbuf *r2,
1521                                    const char *prev,
1522                                    struct commit *origin,
1523                                    struct commit *head)
1524{
1525        const char *head_oid = oid_to_hex(&head->object.oid);
1526
1527        if (!strstr(prev, "..")) {
1528                strbuf_addf(r1, "%s..%s", head_oid, prev);
1529                strbuf_addf(r2, "%s..%s", prev, head_oid);
1530        } else if (!origin) {
1531                die(_("failed to infer range-diff ranges"));
1532        } else {
1533                strbuf_addstr(r1, prev);
1534                strbuf_addf(r2, "%s..%s",
1535                            oid_to_hex(&origin->object.oid), head_oid);
1536        }
1537}
1538
1539int cmd_format_patch(int argc, const char **argv, const char *prefix)
1540{
1541        struct commit *commit;
1542        struct commit **list = NULL;
1543        struct rev_info rev;
1544        struct setup_revision_opt s_r_opt;
1545        int nr = 0, total, i;
1546        int use_stdout = 0;
1547        int start_number = -1;
1548        int just_numbers = 0;
1549        int ignore_if_in_upstream = 0;
1550        int cover_letter = -1;
1551        int boundary_count = 0;
1552        int no_binary_diff = 0;
1553        int zero_commit = 0;
1554        struct commit *origin = NULL;
1555        const char *in_reply_to = NULL;
1556        struct patch_ids ids;
1557        struct strbuf buf = STRBUF_INIT;
1558        int use_patch_format = 0;
1559        int quiet = 0;
1560        int reroll_count = -1;
1561        char *branch_name = NULL;
1562        char *base_commit = NULL;
1563        struct base_tree_info bases;
1564        int show_progress = 0;
1565        struct progress *progress = NULL;
1566        struct oid_array idiff_prev = OID_ARRAY_INIT;
1567        struct strbuf idiff_title = STRBUF_INIT;
1568        const char *rdiff_prev = NULL;
1569        struct strbuf rdiff1 = STRBUF_INIT;
1570        struct strbuf rdiff2 = STRBUF_INIT;
1571        struct strbuf rdiff_title = STRBUF_INIT;
1572        int creation_factor = -1;
1573
1574        const struct option builtin_format_patch_options[] = {
1575                { OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
1576                            N_("use [PATCH n/m] even with a single patch"),
1577                            PARSE_OPT_NOARG, numbered_callback },
1578                { OPTION_CALLBACK, 'N', "no-numbered", &numbered, NULL,
1579                            N_("use [PATCH] even with multiple patches"),
1580                            PARSE_OPT_NOARG | PARSE_OPT_NONEG, no_numbered_callback },
1581                OPT_BOOL('s', "signoff", &do_signoff, N_("add Signed-off-by:")),
1582                OPT_BOOL(0, "stdout", &use_stdout,
1583                            N_("print patches to standard out")),
1584                OPT_BOOL(0, "cover-letter", &cover_letter,
1585                            N_("generate a cover letter")),
1586                OPT_BOOL(0, "numbered-files", &just_numbers,
1587                            N_("use simple number sequence for output file names")),
1588                OPT_STRING(0, "suffix", &fmt_patch_suffix, N_("sfx"),
1589                            N_("use <sfx> instead of '.patch'")),
1590                OPT_INTEGER(0, "start-number", &start_number,
1591                            N_("start numbering patches at <n> instead of 1")),
1592                OPT_INTEGER('v', "reroll-count", &reroll_count,
1593                            N_("mark the series as Nth re-roll")),
1594                { OPTION_CALLBACK, 0, "rfc", &rev, NULL,
1595                            N_("Use [RFC PATCH] instead of [PATCH]"),
1596                            PARSE_OPT_NOARG | PARSE_OPT_NONEG, rfc_callback },
1597                { OPTION_CALLBACK, 0, "subject-prefix", &rev, N_("prefix"),
1598                            N_("Use [<prefix>] instead of [PATCH]"),
1599                            PARSE_OPT_NONEG, subject_prefix_callback },
1600                { OPTION_CALLBACK, 'o', "output-directory", &output_directory,
1601                            N_("dir"), N_("store resulting files in <dir>"),
1602                            PARSE_OPT_NONEG, output_directory_callback },
1603                { OPTION_CALLBACK, 'k', "keep-subject", &rev, NULL,
1604                            N_("don't strip/add [PATCH]"),
1605                            PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback },
1606                OPT_BOOL(0, "no-binary", &no_binary_diff,
1607                         N_("don't output binary diffs")),
1608                OPT_BOOL(0, "zero-commit", &zero_commit,
1609                         N_("output all-zero hash in From header")),
1610                OPT_BOOL(0, "ignore-if-in-upstream", &ignore_if_in_upstream,
1611                         N_("don't include a patch matching a commit upstream")),
1612                OPT_SET_INT_F('p', "no-stat", &use_patch_format,
1613                              N_("show patch format instead of default (patch + stat)"),
1614                              1, PARSE_OPT_NONEG),
1615                OPT_GROUP(N_("Messaging")),
1616                { OPTION_CALLBACK, 0, "add-header", NULL, N_("header"),
1617                            N_("add email header"), 0, header_callback },
1618                { OPTION_CALLBACK, 0, "to", NULL, N_("email"), N_("add To: header"),
1619                            0, to_callback },
1620                { OPTION_CALLBACK, 0, "cc", NULL, N_("email"), N_("add Cc: header"),
1621                            0, cc_callback },
1622                { OPTION_CALLBACK, 0, "from", &from, N_("ident"),
1623                            N_("set From address to <ident> (or committer ident if absent)"),
1624                            PARSE_OPT_OPTARG, from_callback },
1625                OPT_STRING(0, "in-reply-to", &in_reply_to, N_("message-id"),
1626                            N_("make first mail a reply to <message-id>")),
1627                { OPTION_CALLBACK, 0, "attach", &rev, N_("boundary"),
1628                            N_("attach the patch"), PARSE_OPT_OPTARG,
1629                            attach_callback },
1630                { OPTION_CALLBACK, 0, "inline", &rev, N_("boundary"),
1631                            N_("inline the patch"),
1632                            PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
1633                            inline_callback },
1634                { OPTION_CALLBACK, 0, "thread", &thread, N_("style"),
1635                            N_("enable message threading, styles: shallow, deep"),
1636                            PARSE_OPT_OPTARG, thread_callback },
1637                OPT_STRING(0, "signature", &signature, N_("signature"),
1638                            N_("add a signature")),
1639                OPT_STRING(0, "base", &base_commit, N_("base-commit"),
1640                           N_("add prerequisite tree info to the patch series")),
1641                OPT_FILENAME(0, "signature-file", &signature_file,
1642                                N_("add a signature from a file")),
1643                OPT__QUIET(&quiet, N_("don't print the patch filenames")),
1644                OPT_BOOL(0, "progress", &show_progress,
1645                         N_("show progress while generating patches")),
1646                OPT_CALLBACK(0, "interdiff", &idiff_prev, N_("rev"),
1647                             N_("show changes against <rev> in cover letter or single patch"),
1648                             parse_opt_object_name),
1649                OPT_STRING(0, "range-diff", &rdiff_prev, N_("refspec"),
1650                           N_("show changes against <refspec> in cover letter or single patch")),
1651                OPT_INTEGER(0, "creation-factor", &creation_factor,
1652                            N_("percentage by which creation is weighted")),
1653                OPT_END()
1654        };
1655
1656        extra_hdr.strdup_strings = 1;
1657        extra_to.strdup_strings = 1;
1658        extra_cc.strdup_strings = 1;
1659        init_log_defaults();
1660        repo_init_revisions(the_repository, &rev, prefix);
1661        git_config(git_format_config, &rev);
1662        rev.commit_format = CMIT_FMT_EMAIL;
1663        rev.expand_tabs_in_log_default = 0;
1664        rev.verbose_header = 1;
1665        rev.diff = 1;
1666        rev.max_parents = 1;
1667        rev.diffopt.flags.recursive = 1;
1668        rev.subject_prefix = fmt_patch_subject_prefix;
1669        memset(&s_r_opt, 0, sizeof(s_r_opt));
1670        s_r_opt.def = "HEAD";
1671        s_r_opt.revarg_opt = REVARG_COMMITTISH;
1672
1673        if (default_attach) {
1674                rev.mime_boundary = default_attach;
1675                rev.no_inline = 1;
1676        }
1677
1678        /*
1679         * Parse the arguments before setup_revisions(), or something
1680         * like "git format-patch -o a123 HEAD^.." may fail; a123 is
1681         * possibly a valid SHA1.
1682         */
1683        argc = parse_options(argc, argv, prefix, builtin_format_patch_options,
1684                             builtin_format_patch_usage,
1685                             PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
1686                             PARSE_OPT_KEEP_DASHDASH);
1687
1688        if (0 < reroll_count) {
1689                struct strbuf sprefix = STRBUF_INIT;
1690                strbuf_addf(&sprefix, "%s v%d",
1691                            rev.subject_prefix, reroll_count);
1692                rev.reroll_count = reroll_count;
1693                rev.subject_prefix = strbuf_detach(&sprefix, NULL);
1694        }
1695
1696        for (i = 0; i < extra_hdr.nr; i++) {
1697                strbuf_addstr(&buf, extra_hdr.items[i].string);
1698                strbuf_addch(&buf, '\n');
1699        }
1700
1701        if (extra_to.nr)
1702                strbuf_addstr(&buf, "To: ");
1703        for (i = 0; i < extra_to.nr; i++) {
1704                if (i)
1705                        strbuf_addstr(&buf, "    ");
1706                strbuf_addstr(&buf, extra_to.items[i].string);
1707                if (i + 1 < extra_to.nr)
1708                        strbuf_addch(&buf, ',');
1709                strbuf_addch(&buf, '\n');
1710        }
1711
1712        if (extra_cc.nr)
1713                strbuf_addstr(&buf, "Cc: ");
1714        for (i = 0; i < extra_cc.nr; i++) {
1715                if (i)
1716                        strbuf_addstr(&buf, "    ");
1717                strbuf_addstr(&buf, extra_cc.items[i].string);
1718                if (i + 1 < extra_cc.nr)
1719                        strbuf_addch(&buf, ',');
1720                strbuf_addch(&buf, '\n');
1721        }
1722
1723        rev.extra_headers = strbuf_detach(&buf, NULL);
1724
1725        if (from) {
1726                if (split_ident_line(&rev.from_ident, from, strlen(from)))
1727                        die(_("invalid ident line: %s"), from);
1728        }
1729
1730        if (start_number < 0)
1731                start_number = 1;
1732
1733        /*
1734         * If numbered is set solely due to format.numbered in config,
1735         * and it would conflict with --keep-subject (-k) from the
1736         * command line, reset "numbered".
1737         */
1738        if (numbered && keep_subject && !numbered_cmdline_opt)
1739                numbered = 0;
1740
1741        if (numbered && keep_subject)
1742                die(_("-n and -k are mutually exclusive"));
1743        if (keep_subject && subject_prefix)
1744                die(_("--subject-prefix/--rfc and -k are mutually exclusive"));
1745        rev.preserve_subject = keep_subject;
1746
1747        argc = setup_revisions(argc, argv, &rev, &s_r_opt);
1748        if (argc > 1)
1749                die(_("unrecognized argument: %s"), argv[1]);
1750
1751        if (rev.diffopt.output_format & DIFF_FORMAT_NAME)
1752                die(_("--name-only does not make sense"));
1753        if (rev.diffopt.output_format & DIFF_FORMAT_NAME_STATUS)
1754                die(_("--name-status does not make sense"));
1755        if (rev.diffopt.output_format & DIFF_FORMAT_CHECKDIFF)
1756                die(_("--check does not make sense"));
1757
1758        if (!use_patch_format &&
1759                (!rev.diffopt.output_format ||
1760                 rev.diffopt.output_format == DIFF_FORMAT_PATCH))
1761                rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY;
1762        if (!rev.diffopt.stat_width)
1763                rev.diffopt.stat_width = MAIL_DEFAULT_WRAP;
1764
1765        /* Always generate a patch */
1766        rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
1767
1768        rev.zero_commit = zero_commit;
1769
1770        if (!rev.diffopt.flags.text && !no_binary_diff)
1771                rev.diffopt.flags.binary = 1;
1772
1773        if (rev.show_notes)
1774                init_display_notes(&rev.notes_opt);
1775
1776        if (!output_directory && !use_stdout)
1777                output_directory = config_output_directory;
1778
1779        if (!use_stdout)
1780                output_directory = set_outdir(prefix, output_directory);
1781        else
1782                setup_pager();
1783
1784        if (output_directory) {
1785                if (rev.diffopt.use_color != GIT_COLOR_ALWAYS)
1786                        rev.diffopt.use_color = GIT_COLOR_NEVER;
1787                if (use_stdout)
1788                        die(_("standard output, or directory, which one?"));
1789                if (mkdir(output_directory, 0777) < 0 && errno != EEXIST)
1790                        die_errno(_("could not create directory '%s'"),
1791                                  output_directory);
1792        }
1793
1794        if (rev.pending.nr == 1) {
1795                int check_head = 0;
1796
1797                if (rev.max_count < 0 && !rev.show_root_diff) {
1798                        /*
1799                         * This is traditional behaviour of "git format-patch
1800                         * origin" that prepares what the origin side still
1801                         * does not have.
1802                         */
1803                        rev.pending.objects[0].item->flags |= UNINTERESTING;
1804                        add_head_to_pending(&rev);
1805                        check_head = 1;
1806                }
1807                /*
1808                 * Otherwise, it is "format-patch -22 HEAD", and/or
1809                 * "format-patch --root HEAD".  The user wants
1810                 * get_revision() to do the usual traversal.
1811                 */
1812
1813                if (!strcmp(rev.pending.objects[0].name, "HEAD"))
1814                        check_head = 1;
1815
1816                if (check_head) {
1817                        const char *ref, *v;
1818                        ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
1819                                                 NULL, NULL);
1820                        if (ref && skip_prefix(ref, "refs/heads/", &v))
1821                                branch_name = xstrdup(v);
1822                        else
1823                                branch_name = xstrdup(""); /* no branch */
1824                }
1825        }
1826
1827        /*
1828         * We cannot move this anywhere earlier because we do want to
1829         * know if --root was given explicitly from the command line.
1830         */
1831        rev.show_root_diff = 1;
1832
1833        if (ignore_if_in_upstream) {
1834                /* Don't say anything if head and upstream are the same. */
1835                if (rev.pending.nr == 2) {
1836                        struct object_array_entry *o = rev.pending.objects;
1837                        if (oideq(&o[0].item->oid, &o[1].item->oid))
1838                                goto done;
1839                }
1840                get_patch_ids(&rev, &ids);
1841        }
1842
1843        if (prepare_revision_walk(&rev))
1844                die(_("revision walk setup failed"));
1845        rev.boundary = 1;
1846        while ((commit = get_revision(&rev)) != NULL) {
1847                if (commit->object.flags & BOUNDARY) {
1848                        boundary_count++;
1849                        origin = (boundary_count == 1) ? commit : NULL;
1850                        continue;
1851                }
1852
1853                if (ignore_if_in_upstream && has_commit_patch_id(commit, &ids))
1854                        continue;
1855
1856                nr++;
1857                REALLOC_ARRAY(list, nr);
1858                list[nr - 1] = commit;
1859        }
1860        if (nr == 0)
1861                /* nothing to do */
1862                goto done;
1863        total = nr;
1864        if (cover_letter == -1) {
1865                if (config_cover_letter == COVER_AUTO)
1866                        cover_letter = (total > 1);
1867                else
1868                        cover_letter = (config_cover_letter == COVER_ON);
1869        }
1870        if (!keep_subject && auto_number && (total > 1 || cover_letter))
1871                numbered = 1;
1872        if (numbered)
1873                rev.total = total + start_number - 1;
1874
1875        if (idiff_prev.nr) {
1876                if (!cover_letter && total != 1)
1877                        die(_("--interdiff requires --cover-letter or single patch"));
1878                rev.idiff_oid1 = &idiff_prev.oid[idiff_prev.nr - 1];
1879                rev.idiff_oid2 = get_commit_tree_oid(list[0]);
1880                rev.idiff_title = diff_title(&idiff_title, reroll_count,
1881                                             _("Interdiff:"),
1882                                             _("Interdiff against v%d:"));
1883        }
1884
1885        if (creation_factor < 0)
1886                creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT;
1887        else if (!rdiff_prev)
1888                die(_("--creation-factor requires --range-diff"));
1889
1890        if (rdiff_prev) {
1891                if (!cover_letter && total != 1)
1892                        die(_("--range-diff requires --cover-letter or single patch"));
1893
1894                infer_range_diff_ranges(&rdiff1, &rdiff2, rdiff_prev,
1895                                        origin, list[0]);
1896                rev.rdiff1 = rdiff1.buf;
1897                rev.rdiff2 = rdiff2.buf;
1898                rev.creation_factor = creation_factor;
1899                rev.rdiff_title = diff_title(&rdiff_title, reroll_count,
1900                                             _("Range-diff:"),
1901                                             _("Range-diff against v%d:"));
1902        }
1903
1904        if (!signature) {
1905                ; /* --no-signature inhibits all signatures */
1906        } else if (signature && signature != git_version_string) {
1907                ; /* non-default signature already set */
1908        } else if (signature_file) {
1909                struct strbuf buf = STRBUF_INIT;
1910
1911                if (strbuf_read_file(&buf, signature_file, 128) < 0)
1912                        die_errno(_("unable to read signature file '%s'"), signature_file);
1913                signature = strbuf_detach(&buf, NULL);
1914        }
1915
1916        memset(&bases, 0, sizeof(bases));
1917        if (base_commit || base_auto) {
1918                struct commit *base = get_base_commit(base_commit, list, nr);
1919                reset_revision_walk();
1920                clear_object_flags(UNINTERESTING);
1921                prepare_bases(&bases, base, list, nr);
1922        }
1923
1924        if (in_reply_to || thread || cover_letter)
1925                rev.ref_message_ids = xcalloc(1, sizeof(struct string_list));
1926        if (in_reply_to) {
1927                const char *msgid = clean_message_id(in_reply_to);
1928                string_list_append(rev.ref_message_ids, msgid);
1929        }
1930        rev.numbered_files = just_numbers;
1931        rev.patch_suffix = fmt_patch_suffix;
1932        if (cover_letter) {
1933                if (thread)
1934                        gen_message_id(&rev, "cover");
1935                make_cover_letter(&rev, use_stdout,
1936                                  origin, nr, list, branch_name, quiet);
1937                print_bases(&bases, rev.diffopt.file);
1938                print_signature(rev.diffopt.file);
1939                total++;
1940                start_number--;
1941                /* interdiff/range-diff in cover-letter; omit from patches */
1942                rev.idiff_oid1 = NULL;
1943                rev.rdiff1 = NULL;
1944        }
1945        rev.add_signoff = do_signoff;
1946
1947        if (show_progress)
1948                progress = start_delayed_progress(_("Generating patches"), total);
1949        while (0 <= --nr) {
1950                int shown;
1951                display_progress(progress, total - nr);
1952                commit = list[nr];
1953                rev.nr = total - nr + (start_number - 1);
1954                /* Make the second and subsequent mails replies to the first */
1955                if (thread) {
1956                        /* Have we already had a message ID? */
1957                        if (rev.message_id) {
1958                                /*
1959                                 * For deep threading: make every mail
1960                                 * a reply to the previous one, no
1961                                 * matter what other options are set.
1962                                 *
1963                                 * For shallow threading:
1964                                 *
1965                                 * Without --cover-letter and
1966                                 * --in-reply-to, make every mail a
1967                                 * reply to the one before.
1968                                 *
1969                                 * With --in-reply-to but no
1970                                 * --cover-letter, make every mail a
1971                                 * reply to the <reply-to>.
1972                                 *
1973                                 * With --cover-letter, make every
1974                                 * mail but the cover letter a reply
1975                                 * to the cover letter.  The cover
1976                                 * letter is a reply to the
1977                                 * --in-reply-to, if specified.
1978                                 */
1979                                if (thread == THREAD_SHALLOW
1980                                    && rev.ref_message_ids->nr > 0
1981                                    && (!cover_letter || rev.nr > 1))
1982                                        free(rev.message_id);
1983                                else
1984                                        string_list_append(rev.ref_message_ids,
1985                                                           rev.message_id);
1986                        }
1987                        gen_message_id(&rev, oid_to_hex(&commit->object.oid));
1988                }
1989
1990                if (!use_stdout &&
1991                    open_next_file(rev.numbered_files ? NULL : commit, NULL, &rev, quiet))
1992                        die(_("failed to create output files"));
1993                shown = log_tree_commit(&rev, commit);
1994                free_commit_buffer(the_repository->parsed_objects,
1995                                   commit);
1996
1997                /* We put one extra blank line between formatted
1998                 * patches and this flag is used by log-tree code
1999                 * to see if it needs to emit a LF before showing
2000                 * the log; when using one file per patch, we do
2001                 * not want the extra blank line.
2002                 */
2003                if (!use_stdout)
2004                        rev.shown_one = 0;
2005                if (shown) {
2006                        print_bases(&bases, rev.diffopt.file);
2007                        if (rev.mime_boundary)
2008                                fprintf(rev.diffopt.file, "\n--%s%s--\n\n\n",
2009                                       mime_boundary_leader,
2010                                       rev.mime_boundary);
2011                        else
2012                                print_signature(rev.diffopt.file);
2013                }
2014                if (!use_stdout)
2015                        fclose(rev.diffopt.file);
2016        }
2017        stop_progress(&progress);
2018        free(list);
2019        free(branch_name);
2020        string_list_clear(&extra_to, 0);
2021        string_list_clear(&extra_cc, 0);
2022        string_list_clear(&extra_hdr, 0);
2023        if (ignore_if_in_upstream)
2024                free_patch_ids(&ids);
2025
2026done:
2027        oid_array_clear(&idiff_prev);
2028        strbuf_release(&idiff_title);
2029        strbuf_release(&rdiff1);
2030        strbuf_release(&rdiff2);
2031        strbuf_release(&rdiff_title);
2032        return 0;
2033}
2034
2035static int add_pending_commit(const char *arg, struct rev_info *revs, int flags)
2036{
2037        struct object_id oid;
2038        if (get_oid(arg, &oid) == 0) {
2039                struct commit *commit = lookup_commit_reference(the_repository,
2040                                                                &oid);
2041                if (commit) {
2042                        commit->object.flags |= flags;
2043                        add_pending_object(revs, &commit->object, arg);
2044                        return 0;
2045                }
2046        }
2047        return -1;
2048}
2049
2050static const char * const cherry_usage[] = {
2051        N_("git cherry [-v] [<upstream> [<head> [<limit>]]]"),
2052        NULL
2053};
2054
2055static void print_commit(char sign, struct commit *commit, int verbose,
2056                         int abbrev, FILE *file)
2057{
2058        if (!verbose) {
2059                fprintf(file, "%c %s\n", sign,
2060                       find_unique_abbrev(&commit->object.oid, abbrev));
2061        } else {
2062                struct strbuf buf = STRBUF_INIT;
2063                pp_commit_easy(CMIT_FMT_ONELINE, commit, &buf);
2064                fprintf(file, "%c %s %s\n", sign,
2065                       find_unique_abbrev(&commit->object.oid, abbrev),
2066                       buf.buf);
2067                strbuf_release(&buf);
2068        }
2069}
2070
2071int cmd_cherry(int argc, const char **argv, const char *prefix)
2072{
2073        struct rev_info revs;
2074        struct patch_ids ids;
2075        struct commit *commit;
2076        struct commit_list *list = NULL;
2077        struct branch *current_branch;
2078        const char *upstream;
2079        const char *head = "HEAD";
2080        const char *limit = NULL;
2081        int verbose = 0, abbrev = 0;
2082
2083        struct option options[] = {
2084                OPT__ABBREV(&abbrev),
2085                OPT__VERBOSE(&verbose, N_("be verbose")),
2086                OPT_END()
2087        };
2088
2089        argc = parse_options(argc, argv, prefix, options, cherry_usage, 0);
2090
2091        switch (argc) {
2092        case 3:
2093                limit = argv[2];
2094                /* FALLTHROUGH */
2095        case 2:
2096                head = argv[1];
2097                /* FALLTHROUGH */
2098        case 1:
2099                upstream = argv[0];
2100                break;
2101        default:
2102                current_branch = branch_get(NULL);
2103                upstream = branch_get_upstream(current_branch, NULL);
2104                if (!upstream) {
2105                        fprintf(stderr, _("Could not find a tracked"
2106                                        " remote branch, please"
2107                                        " specify <upstream> manually.\n"));
2108                        usage_with_options(cherry_usage, options);
2109                }
2110        }
2111
2112        repo_init_revisions(the_repository, &revs, prefix);
2113        revs.max_parents = 1;
2114
2115        if (add_pending_commit(head, &revs, 0))
2116                die(_("unknown commit %s"), head);
2117        if (add_pending_commit(upstream, &revs, UNINTERESTING))
2118                die(_("unknown commit %s"), upstream);
2119
2120        /* Don't say anything if head and upstream are the same. */
2121        if (revs.pending.nr == 2) {
2122                struct object_array_entry *o = revs.pending.objects;
2123                if (oideq(&o[0].item->oid, &o[1].item->oid))
2124                        return 0;
2125        }
2126
2127        get_patch_ids(&revs, &ids);
2128
2129        if (limit && add_pending_commit(limit, &revs, UNINTERESTING))
2130                die(_("unknown commit %s"), limit);
2131
2132        /* reverse the list of commits */
2133        if (prepare_revision_walk(&revs))
2134                die(_("revision walk setup failed"));
2135        while ((commit = get_revision(&revs)) != NULL) {
2136                commit_list_insert(commit, &list);
2137        }
2138
2139        while (list) {
2140                char sign = '+';
2141
2142                commit = list->item;
2143                if (has_commit_patch_id(commit, &ids))
2144                        sign = '-';
2145                print_commit(sign, commit, verbose, abbrev, revs.diffopt.file);
2146                list = list->next;
2147        }
2148
2149        free_patch_ids(&ids);
2150        return 0;
2151}