builtin / blame.con commit submodule: port submodule subcommand 'status' from shell to C (a9f8a37)
   1/*
   2 * Blame
   3 *
   4 * Copyright (c) 2006, 2014 by its authors
   5 * See COPYING for licensing conditions
   6 */
   7
   8#include "cache.h"
   9#include "config.h"
  10#include "builtin.h"
  11#include "commit.h"
  12#include "diff.h"
  13#include "revision.h"
  14#include "quote.h"
  15#include "string-list.h"
  16#include "mailmap.h"
  17#include "parse-options.h"
  18#include "prio-queue.h"
  19#include "utf8.h"
  20#include "userdiff.h"
  21#include "line-range.h"
  22#include "line-log.h"
  23#include "dir.h"
  24#include "progress.h"
  25#include "blame.h"
  26
  27static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
  28
  29static const char *blame_opt_usage[] = {
  30        blame_usage,
  31        "",
  32        N_("<rev-opts> are documented in git-rev-list(1)"),
  33        NULL
  34};
  35
  36static int longest_file;
  37static int longest_author;
  38static int max_orig_digits;
  39static int max_digits;
  40static int max_score_digits;
  41static int show_root;
  42static int reverse;
  43static int blank_boundary;
  44static int incremental;
  45static int xdl_opts;
  46static int abbrev = -1;
  47static int no_whole_file_rename;
  48static int show_progress;
  49
  50static struct date_mode blame_date_mode = { DATE_ISO8601 };
  51static size_t blame_date_width;
  52
  53static struct string_list mailmap = STRING_LIST_INIT_NODUP;
  54
  55#ifndef DEBUG
  56#define DEBUG 0
  57#endif
  58
  59static unsigned blame_move_score;
  60static unsigned blame_copy_score;
  61
  62/* Remember to update object flag allocation in object.h */
  63#define METAINFO_SHOWN          (1u<<12)
  64#define MORE_THAN_ONE_PATH      (1u<<13)
  65
  66struct progress_info {
  67        struct progress *progress;
  68        int blamed_lines;
  69};
  70
  71static const char *nth_line_cb(void *data, long lno)
  72{
  73        return blame_nth_line((struct blame_scoreboard *)data, lno);
  74}
  75
  76/*
  77 * Information on commits, used for output.
  78 */
  79struct commit_info {
  80        struct strbuf author;
  81        struct strbuf author_mail;
  82        timestamp_t author_time;
  83        struct strbuf author_tz;
  84
  85        /* filled only when asked for details */
  86        struct strbuf committer;
  87        struct strbuf committer_mail;
  88        timestamp_t committer_time;
  89        struct strbuf committer_tz;
  90
  91        struct strbuf summary;
  92};
  93
  94/*
  95 * Parse author/committer line in the commit object buffer
  96 */
  97static void get_ac_line(const char *inbuf, const char *what,
  98        struct strbuf *name, struct strbuf *mail,
  99        timestamp_t *time, struct strbuf *tz)
 100{
 101        struct ident_split ident;
 102        size_t len, maillen, namelen;
 103        char *tmp, *endp;
 104        const char *namebuf, *mailbuf;
 105
 106        tmp = strstr(inbuf, what);
 107        if (!tmp)
 108                goto error_out;
 109        tmp += strlen(what);
 110        endp = strchr(tmp, '\n');
 111        if (!endp)
 112                len = strlen(tmp);
 113        else
 114                len = endp - tmp;
 115
 116        if (split_ident_line(&ident, tmp, len)) {
 117        error_out:
 118                /* Ugh */
 119                tmp = "(unknown)";
 120                strbuf_addstr(name, tmp);
 121                strbuf_addstr(mail, tmp);
 122                strbuf_addstr(tz, tmp);
 123                *time = 0;
 124                return;
 125        }
 126
 127        namelen = ident.name_end - ident.name_begin;
 128        namebuf = ident.name_begin;
 129
 130        maillen = ident.mail_end - ident.mail_begin;
 131        mailbuf = ident.mail_begin;
 132
 133        if (ident.date_begin && ident.date_end)
 134                *time = strtoul(ident.date_begin, NULL, 10);
 135        else
 136                *time = 0;
 137
 138        if (ident.tz_begin && ident.tz_end)
 139                strbuf_add(tz, ident.tz_begin, ident.tz_end - ident.tz_begin);
 140        else
 141                strbuf_addstr(tz, "(unknown)");
 142
 143        /*
 144         * Now, convert both name and e-mail using mailmap
 145         */
 146        map_user(&mailmap, &mailbuf, &maillen,
 147                 &namebuf, &namelen);
 148
 149        strbuf_addf(mail, "<%.*s>", (int)maillen, mailbuf);
 150        strbuf_add(name, namebuf, namelen);
 151}
 152
 153static void commit_info_init(struct commit_info *ci)
 154{
 155
 156        strbuf_init(&ci->author, 0);
 157        strbuf_init(&ci->author_mail, 0);
 158        strbuf_init(&ci->author_tz, 0);
 159        strbuf_init(&ci->committer, 0);
 160        strbuf_init(&ci->committer_mail, 0);
 161        strbuf_init(&ci->committer_tz, 0);
 162        strbuf_init(&ci->summary, 0);
 163}
 164
 165static void commit_info_destroy(struct commit_info *ci)
 166{
 167
 168        strbuf_release(&ci->author);
 169        strbuf_release(&ci->author_mail);
 170        strbuf_release(&ci->author_tz);
 171        strbuf_release(&ci->committer);
 172        strbuf_release(&ci->committer_mail);
 173        strbuf_release(&ci->committer_tz);
 174        strbuf_release(&ci->summary);
 175}
 176
 177static void get_commit_info(struct commit *commit,
 178                            struct commit_info *ret,
 179                            int detailed)
 180{
 181        int len;
 182        const char *subject, *encoding;
 183        const char *message;
 184
 185        commit_info_init(ret);
 186
 187        encoding = get_log_output_encoding();
 188        message = logmsg_reencode(commit, NULL, encoding);
 189        get_ac_line(message, "\nauthor ",
 190                    &ret->author, &ret->author_mail,
 191                    &ret->author_time, &ret->author_tz);
 192
 193        if (!detailed) {
 194                unuse_commit_buffer(commit, message);
 195                return;
 196        }
 197
 198        get_ac_line(message, "\ncommitter ",
 199                    &ret->committer, &ret->committer_mail,
 200                    &ret->committer_time, &ret->committer_tz);
 201
 202        len = find_commit_subject(message, &subject);
 203        if (len)
 204                strbuf_add(&ret->summary, subject, len);
 205        else
 206                strbuf_addf(&ret->summary, "(%s)", oid_to_hex(&commit->object.oid));
 207
 208        unuse_commit_buffer(commit, message);
 209}
 210
 211/*
 212 * Write out any suspect information which depends on the path. This must be
 213 * handled separately from emit_one_suspect_detail(), because a given commit
 214 * may have changes in multiple paths. So this needs to appear each time
 215 * we mention a new group.
 216 *
 217 * To allow LF and other nonportable characters in pathnames,
 218 * they are c-style quoted as needed.
 219 */
 220static void write_filename_info(struct blame_origin *suspect)
 221{
 222        if (suspect->previous) {
 223                struct blame_origin *prev = suspect->previous;
 224                printf("previous %s ", oid_to_hex(&prev->commit->object.oid));
 225                write_name_quoted(prev->path, stdout, '\n');
 226        }
 227        printf("filename ");
 228        write_name_quoted(suspect->path, stdout, '\n');
 229}
 230
 231/*
 232 * Porcelain/Incremental format wants to show a lot of details per
 233 * commit.  Instead of repeating this every line, emit it only once,
 234 * the first time each commit appears in the output (unless the
 235 * user has specifically asked for us to repeat).
 236 */
 237static int emit_one_suspect_detail(struct blame_origin *suspect, int repeat)
 238{
 239        struct commit_info ci;
 240
 241        if (!repeat && (suspect->commit->object.flags & METAINFO_SHOWN))
 242                return 0;
 243
 244        suspect->commit->object.flags |= METAINFO_SHOWN;
 245        get_commit_info(suspect->commit, &ci, 1);
 246        printf("author %s\n", ci.author.buf);
 247        printf("author-mail %s\n", ci.author_mail.buf);
 248        printf("author-time %"PRItime"\n", ci.author_time);
 249        printf("author-tz %s\n", ci.author_tz.buf);
 250        printf("committer %s\n", ci.committer.buf);
 251        printf("committer-mail %s\n", ci.committer_mail.buf);
 252        printf("committer-time %"PRItime"\n", ci.committer_time);
 253        printf("committer-tz %s\n", ci.committer_tz.buf);
 254        printf("summary %s\n", ci.summary.buf);
 255        if (suspect->commit->object.flags & UNINTERESTING)
 256                printf("boundary\n");
 257
 258        commit_info_destroy(&ci);
 259
 260        return 1;
 261}
 262
 263/*
 264 * The blame_entry is found to be guilty for the range.
 265 * Show it in incremental output.
 266 */
 267static void found_guilty_entry(struct blame_entry *ent, void *data)
 268{
 269        struct progress_info *pi = (struct progress_info *)data;
 270
 271        if (incremental) {
 272                struct blame_origin *suspect = ent->suspect;
 273
 274                printf("%s %d %d %d\n",
 275                       oid_to_hex(&suspect->commit->object.oid),
 276                       ent->s_lno + 1, ent->lno + 1, ent->num_lines);
 277                emit_one_suspect_detail(suspect, 0);
 278                write_filename_info(suspect);
 279                maybe_flush_or_die(stdout, "stdout");
 280        }
 281        pi->blamed_lines += ent->num_lines;
 282        display_progress(pi->progress, pi->blamed_lines);
 283}
 284
 285static const char *format_time(timestamp_t time, const char *tz_str,
 286                               int show_raw_time)
 287{
 288        static struct strbuf time_buf = STRBUF_INIT;
 289
 290        strbuf_reset(&time_buf);
 291        if (show_raw_time) {
 292                strbuf_addf(&time_buf, "%"PRItime" %s", time, tz_str);
 293        }
 294        else {
 295                const char *time_str;
 296                size_t time_width;
 297                int tz;
 298                tz = atoi(tz_str);
 299                time_str = show_date(time, tz, &blame_date_mode);
 300                strbuf_addstr(&time_buf, time_str);
 301                /*
 302                 * Add space paddings to time_buf to display a fixed width
 303                 * string, and use time_width for display width calibration.
 304                 */
 305                for (time_width = utf8_strwidth(time_str);
 306                     time_width < blame_date_width;
 307                     time_width++)
 308                        strbuf_addch(&time_buf, ' ');
 309        }
 310        return time_buf.buf;
 311}
 312
 313#define OUTPUT_ANNOTATE_COMPAT  001
 314#define OUTPUT_LONG_OBJECT_NAME 002
 315#define OUTPUT_RAW_TIMESTAMP    004
 316#define OUTPUT_PORCELAIN        010
 317#define OUTPUT_SHOW_NAME        020
 318#define OUTPUT_SHOW_NUMBER      040
 319#define OUTPUT_SHOW_SCORE      0100
 320#define OUTPUT_NO_AUTHOR       0200
 321#define OUTPUT_SHOW_EMAIL       0400
 322#define OUTPUT_LINE_PORCELAIN 01000
 323
 324static void emit_porcelain_details(struct blame_origin *suspect, int repeat)
 325{
 326        if (emit_one_suspect_detail(suspect, repeat) ||
 327            (suspect->commit->object.flags & MORE_THAN_ONE_PATH))
 328                write_filename_info(suspect);
 329}
 330
 331static void emit_porcelain(struct blame_scoreboard *sb, struct blame_entry *ent,
 332                           int opt)
 333{
 334        int repeat = opt & OUTPUT_LINE_PORCELAIN;
 335        int cnt;
 336        const char *cp;
 337        struct blame_origin *suspect = ent->suspect;
 338        char hex[GIT_MAX_HEXSZ + 1];
 339
 340        oid_to_hex_r(hex, &suspect->commit->object.oid);
 341        printf("%s %d %d %d\n",
 342               hex,
 343               ent->s_lno + 1,
 344               ent->lno + 1,
 345               ent->num_lines);
 346        emit_porcelain_details(suspect, repeat);
 347
 348        cp = blame_nth_line(sb, ent->lno);
 349        for (cnt = 0; cnt < ent->num_lines; cnt++) {
 350                char ch;
 351                if (cnt) {
 352                        printf("%s %d %d\n", hex,
 353                               ent->s_lno + 1 + cnt,
 354                               ent->lno + 1 + cnt);
 355                        if (repeat)
 356                                emit_porcelain_details(suspect, 1);
 357                }
 358                putchar('\t');
 359                do {
 360                        ch = *cp++;
 361                        putchar(ch);
 362                } while (ch != '\n' &&
 363                         cp < sb->final_buf + sb->final_buf_size);
 364        }
 365
 366        if (sb->final_buf_size && cp[-1] != '\n')
 367                putchar('\n');
 368}
 369
 370static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int opt)
 371{
 372        int cnt;
 373        const char *cp;
 374        struct blame_origin *suspect = ent->suspect;
 375        struct commit_info ci;
 376        char hex[GIT_MAX_HEXSZ + 1];
 377        int show_raw_time = !!(opt & OUTPUT_RAW_TIMESTAMP);
 378
 379        get_commit_info(suspect->commit, &ci, 1);
 380        oid_to_hex_r(hex, &suspect->commit->object.oid);
 381
 382        cp = blame_nth_line(sb, ent->lno);
 383        for (cnt = 0; cnt < ent->num_lines; cnt++) {
 384                char ch;
 385                int length = (opt & OUTPUT_LONG_OBJECT_NAME) ? GIT_SHA1_HEXSZ : abbrev;
 386
 387                if (suspect->commit->object.flags & UNINTERESTING) {
 388                        if (blank_boundary)
 389                                memset(hex, ' ', length);
 390                        else if (!(opt & OUTPUT_ANNOTATE_COMPAT)) {
 391                                length--;
 392                                putchar('^');
 393                        }
 394                }
 395
 396                printf("%.*s", length, hex);
 397                if (opt & OUTPUT_ANNOTATE_COMPAT) {
 398                        const char *name;
 399                        if (opt & OUTPUT_SHOW_EMAIL)
 400                                name = ci.author_mail.buf;
 401                        else
 402                                name = ci.author.buf;
 403                        printf("\t(%10s\t%10s\t%d)", name,
 404                               format_time(ci.author_time, ci.author_tz.buf,
 405                                           show_raw_time),
 406                               ent->lno + 1 + cnt);
 407                } else {
 408                        if (opt & OUTPUT_SHOW_SCORE)
 409                                printf(" %*d %02d",
 410                                       max_score_digits, ent->score,
 411                                       ent->suspect->refcnt);
 412                        if (opt & OUTPUT_SHOW_NAME)
 413                                printf(" %-*.*s", longest_file, longest_file,
 414                                       suspect->path);
 415                        if (opt & OUTPUT_SHOW_NUMBER)
 416                                printf(" %*d", max_orig_digits,
 417                                       ent->s_lno + 1 + cnt);
 418
 419                        if (!(opt & OUTPUT_NO_AUTHOR)) {
 420                                const char *name;
 421                                int pad;
 422                                if (opt & OUTPUT_SHOW_EMAIL)
 423                                        name = ci.author_mail.buf;
 424                                else
 425                                        name = ci.author.buf;
 426                                pad = longest_author - utf8_strwidth(name);
 427                                printf(" (%s%*s %10s",
 428                                       name, pad, "",
 429                                       format_time(ci.author_time,
 430                                                   ci.author_tz.buf,
 431                                                   show_raw_time));
 432                        }
 433                        printf(" %*d) ",
 434                               max_digits, ent->lno + 1 + cnt);
 435                }
 436                do {
 437                        ch = *cp++;
 438                        putchar(ch);
 439                } while (ch != '\n' &&
 440                         cp < sb->final_buf + sb->final_buf_size);
 441        }
 442
 443        if (sb->final_buf_size && cp[-1] != '\n')
 444                putchar('\n');
 445
 446        commit_info_destroy(&ci);
 447}
 448
 449static void output(struct blame_scoreboard *sb, int option)
 450{
 451        struct blame_entry *ent;
 452
 453        if (option & OUTPUT_PORCELAIN) {
 454                for (ent = sb->ent; ent; ent = ent->next) {
 455                        int count = 0;
 456                        struct blame_origin *suspect;
 457                        struct commit *commit = ent->suspect->commit;
 458                        if (commit->object.flags & MORE_THAN_ONE_PATH)
 459                                continue;
 460                        for (suspect = commit->util; suspect; suspect = suspect->next) {
 461                                if (suspect->guilty && count++) {
 462                                        commit->object.flags |= MORE_THAN_ONE_PATH;
 463                                        break;
 464                                }
 465                        }
 466                }
 467        }
 468
 469        for (ent = sb->ent; ent; ent = ent->next) {
 470                if (option & OUTPUT_PORCELAIN)
 471                        emit_porcelain(sb, ent, option);
 472                else {
 473                        emit_other(sb, ent, option);
 474                }
 475        }
 476}
 477
 478/*
 479 * Add phony grafts for use with -S; this is primarily to
 480 * support git's cvsserver that wants to give a linear history
 481 * to its clients.
 482 */
 483static int read_ancestry(const char *graft_file)
 484{
 485        FILE *fp = fopen_or_warn(graft_file, "r");
 486        struct strbuf buf = STRBUF_INIT;
 487        if (!fp)
 488                return -1;
 489        while (!strbuf_getwholeline(&buf, fp, '\n')) {
 490                /* The format is just "Commit Parent1 Parent2 ...\n" */
 491                struct commit_graft *graft = read_graft_line(&buf);
 492                if (graft)
 493                        register_commit_graft(graft, 0);
 494        }
 495        fclose(fp);
 496        strbuf_release(&buf);
 497        return 0;
 498}
 499
 500static int update_auto_abbrev(int auto_abbrev, struct blame_origin *suspect)
 501{
 502        const char *uniq = find_unique_abbrev(suspect->commit->object.oid.hash,
 503                                              auto_abbrev);
 504        int len = strlen(uniq);
 505        if (auto_abbrev < len)
 506                return len;
 507        return auto_abbrev;
 508}
 509
 510/*
 511 * How many columns do we need to show line numbers, authors,
 512 * and filenames?
 513 */
 514static void find_alignment(struct blame_scoreboard *sb, int *option)
 515{
 516        int longest_src_lines = 0;
 517        int longest_dst_lines = 0;
 518        unsigned largest_score = 0;
 519        struct blame_entry *e;
 520        int compute_auto_abbrev = (abbrev < 0);
 521        int auto_abbrev = DEFAULT_ABBREV;
 522
 523        for (e = sb->ent; e; e = e->next) {
 524                struct blame_origin *suspect = e->suspect;
 525                int num;
 526
 527                if (compute_auto_abbrev)
 528                        auto_abbrev = update_auto_abbrev(auto_abbrev, suspect);
 529                if (strcmp(suspect->path, sb->path))
 530                        *option |= OUTPUT_SHOW_NAME;
 531                num = strlen(suspect->path);
 532                if (longest_file < num)
 533                        longest_file = num;
 534                if (!(suspect->commit->object.flags & METAINFO_SHOWN)) {
 535                        struct commit_info ci;
 536                        suspect->commit->object.flags |= METAINFO_SHOWN;
 537                        get_commit_info(suspect->commit, &ci, 1);
 538                        if (*option & OUTPUT_SHOW_EMAIL)
 539                                num = utf8_strwidth(ci.author_mail.buf);
 540                        else
 541                                num = utf8_strwidth(ci.author.buf);
 542                        if (longest_author < num)
 543                                longest_author = num;
 544                        commit_info_destroy(&ci);
 545                }
 546                num = e->s_lno + e->num_lines;
 547                if (longest_src_lines < num)
 548                        longest_src_lines = num;
 549                num = e->lno + e->num_lines;
 550                if (longest_dst_lines < num)
 551                        longest_dst_lines = num;
 552                if (largest_score < blame_entry_score(sb, e))
 553                        largest_score = blame_entry_score(sb, e);
 554        }
 555        max_orig_digits = decimal_width(longest_src_lines);
 556        max_digits = decimal_width(longest_dst_lines);
 557        max_score_digits = decimal_width(largest_score);
 558
 559        if (compute_auto_abbrev)
 560                /* one more abbrev length is needed for the boundary commit */
 561                abbrev = auto_abbrev + 1;
 562}
 563
 564static void sanity_check_on_fail(struct blame_scoreboard *sb, int baa)
 565{
 566        int opt = OUTPUT_SHOW_SCORE | OUTPUT_SHOW_NUMBER | OUTPUT_SHOW_NAME;
 567        find_alignment(sb, &opt);
 568        output(sb, opt);
 569        die("Baa %d!", baa);
 570}
 571
 572static unsigned parse_score(const char *arg)
 573{
 574        char *end;
 575        unsigned long score = strtoul(arg, &end, 10);
 576        if (*end)
 577                return 0;
 578        return score;
 579}
 580
 581static const char *add_prefix(const char *prefix, const char *path)
 582{
 583        return prefix_path(prefix, prefix ? strlen(prefix) : 0, path);
 584}
 585
 586static int git_blame_config(const char *var, const char *value, void *cb)
 587{
 588        if (!strcmp(var, "blame.showroot")) {
 589                show_root = git_config_bool(var, value);
 590                return 0;
 591        }
 592        if (!strcmp(var, "blame.blankboundary")) {
 593                blank_boundary = git_config_bool(var, value);
 594                return 0;
 595        }
 596        if (!strcmp(var, "blame.showemail")) {
 597                int *output_option = cb;
 598                if (git_config_bool(var, value))
 599                        *output_option |= OUTPUT_SHOW_EMAIL;
 600                else
 601                        *output_option &= ~OUTPUT_SHOW_EMAIL;
 602                return 0;
 603        }
 604        if (!strcmp(var, "blame.date")) {
 605                if (!value)
 606                        return config_error_nonbool(var);
 607                parse_date_format(value, &blame_date_mode);
 608                return 0;
 609        }
 610
 611        if (git_diff_heuristic_config(var, value, cb) < 0)
 612                return -1;
 613        if (userdiff_config(var, value) < 0)
 614                return -1;
 615
 616        return git_default_config(var, value, cb);
 617}
 618
 619static int blame_copy_callback(const struct option *option, const char *arg, int unset)
 620{
 621        int *opt = option->value;
 622
 623        /*
 624         * -C enables copy from removed files;
 625         * -C -C enables copy from existing files, but only
 626         *       when blaming a new file;
 627         * -C -C -C enables copy from existing files for
 628         *          everybody
 629         */
 630        if (*opt & PICKAXE_BLAME_COPY_HARDER)
 631                *opt |= PICKAXE_BLAME_COPY_HARDEST;
 632        if (*opt & PICKAXE_BLAME_COPY)
 633                *opt |= PICKAXE_BLAME_COPY_HARDER;
 634        *opt |= PICKAXE_BLAME_COPY | PICKAXE_BLAME_MOVE;
 635
 636        if (arg)
 637                blame_copy_score = parse_score(arg);
 638        return 0;
 639}
 640
 641static int blame_move_callback(const struct option *option, const char *arg, int unset)
 642{
 643        int *opt = option->value;
 644
 645        *opt |= PICKAXE_BLAME_MOVE;
 646
 647        if (arg)
 648                blame_move_score = parse_score(arg);
 649        return 0;
 650}
 651
 652int cmd_blame(int argc, const char **argv, const char *prefix)
 653{
 654        struct rev_info revs;
 655        const char *path;
 656        struct blame_scoreboard sb;
 657        struct blame_origin *o;
 658        struct blame_entry *ent = NULL;
 659        long dashdash_pos, lno;
 660        struct progress_info pi = { NULL, 0 };
 661
 662        struct string_list range_list = STRING_LIST_INIT_NODUP;
 663        int output_option = 0, opt = 0;
 664        int show_stats = 0;
 665        const char *revs_file = NULL;
 666        const char *contents_from = NULL;
 667        const struct option options[] = {
 668                OPT_BOOL(0, "incremental", &incremental, N_("Show blame entries as we find them, incrementally")),
 669                OPT_BOOL('b', NULL, &blank_boundary, N_("Show blank SHA-1 for boundary commits (Default: off)")),
 670                OPT_BOOL(0, "root", &show_root, N_("Do not treat root commits as boundaries (Default: off)")),
 671                OPT_BOOL(0, "show-stats", &show_stats, N_("Show work cost statistics")),
 672                OPT_BOOL(0, "progress", &show_progress, N_("Force progress reporting")),
 673                OPT_BIT(0, "score-debug", &output_option, N_("Show output score for blame entries"), OUTPUT_SHOW_SCORE),
 674                OPT_BIT('f', "show-name", &output_option, N_("Show original filename (Default: auto)"), OUTPUT_SHOW_NAME),
 675                OPT_BIT('n', "show-number", &output_option, N_("Show original linenumber (Default: off)"), OUTPUT_SHOW_NUMBER),
 676                OPT_BIT('p', "porcelain", &output_option, N_("Show in a format designed for machine consumption"), OUTPUT_PORCELAIN),
 677                OPT_BIT(0, "line-porcelain", &output_option, N_("Show porcelain format with per-line commit information"), OUTPUT_PORCELAIN|OUTPUT_LINE_PORCELAIN),
 678                OPT_BIT('c', NULL, &output_option, N_("Use the same output mode as git-annotate (Default: off)"), OUTPUT_ANNOTATE_COMPAT),
 679                OPT_BIT('t', NULL, &output_option, N_("Show raw timestamp (Default: off)"), OUTPUT_RAW_TIMESTAMP),
 680                OPT_BIT('l', NULL, &output_option, N_("Show long commit SHA1 (Default: off)"), OUTPUT_LONG_OBJECT_NAME),
 681                OPT_BIT('s', NULL, &output_option, N_("Suppress author name and timestamp (Default: off)"), OUTPUT_NO_AUTHOR),
 682                OPT_BIT('e', "show-email", &output_option, N_("Show author email instead of name (Default: off)"), OUTPUT_SHOW_EMAIL),
 683                OPT_BIT('w', NULL, &xdl_opts, N_("Ignore whitespace differences"), XDF_IGNORE_WHITESPACE),
 684
 685                /*
 686                 * The following two options are parsed by parse_revision_opt()
 687                 * and are only included here to get included in the "-h"
 688                 * output:
 689                 */
 690                { OPTION_LOWLEVEL_CALLBACK, 0, "indent-heuristic", NULL, NULL, N_("Use an experimental heuristic to improve diffs"), PARSE_OPT_NOARG, parse_opt_unknown_cb },
 691
 692                OPT_BIT(0, "minimal", &xdl_opts, N_("Spend extra cycles to find better match"), XDF_NEED_MINIMAL),
 693                OPT_STRING('S', NULL, &revs_file, N_("file"), N_("Use revisions from <file> instead of calling git-rev-list")),
 694                OPT_STRING(0, "contents", &contents_from, N_("file"), N_("Use <file>'s contents as the final image")),
 695                { OPTION_CALLBACK, 'C', NULL, &opt, N_("score"), N_("Find line copies within and across files"), PARSE_OPT_OPTARG, blame_copy_callback },
 696                { OPTION_CALLBACK, 'M', NULL, &opt, N_("score"), N_("Find line movements within and across files"), PARSE_OPT_OPTARG, blame_move_callback },
 697                OPT_STRING_LIST('L', NULL, &range_list, N_("n,m"), N_("Process only line range n,m, counting from 1")),
 698                OPT__ABBREV(&abbrev),
 699                OPT_END()
 700        };
 701
 702        struct parse_opt_ctx_t ctx;
 703        int cmd_is_annotate = !strcmp(argv[0], "annotate");
 704        struct range_set ranges;
 705        unsigned int range_i;
 706        long anchor;
 707
 708        git_config(git_blame_config, &output_option);
 709        init_revisions(&revs, NULL);
 710        revs.date_mode = blame_date_mode;
 711        DIFF_OPT_SET(&revs.diffopt, ALLOW_TEXTCONV);
 712        DIFF_OPT_SET(&revs.diffopt, FOLLOW_RENAMES);
 713
 714        save_commit_buffer = 0;
 715        dashdash_pos = 0;
 716        show_progress = -1;
 717
 718        parse_options_start(&ctx, argc, argv, prefix, options,
 719                            PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0);
 720        for (;;) {
 721                switch (parse_options_step(&ctx, options, blame_opt_usage)) {
 722                case PARSE_OPT_HELP:
 723                        exit(129);
 724                case PARSE_OPT_DONE:
 725                        if (ctx.argv[0])
 726                                dashdash_pos = ctx.cpidx;
 727                        goto parse_done;
 728                }
 729
 730                if (!strcmp(ctx.argv[0], "--reverse")) {
 731                        ctx.argv[0] = "--children";
 732                        reverse = 1;
 733                }
 734                parse_revision_opt(&revs, &ctx, options, blame_opt_usage);
 735        }
 736parse_done:
 737        no_whole_file_rename = !DIFF_OPT_TST(&revs.diffopt, FOLLOW_RENAMES);
 738        xdl_opts |= revs.diffopt.xdl_opts & XDF_INDENT_HEURISTIC;
 739        DIFF_OPT_CLR(&revs.diffopt, FOLLOW_RENAMES);
 740        argc = parse_options_end(&ctx);
 741
 742        if (incremental || (output_option & OUTPUT_PORCELAIN)) {
 743                if (show_progress > 0)
 744                        die(_("--progress can't be used with --incremental or porcelain formats"));
 745                show_progress = 0;
 746        } else if (show_progress < 0)
 747                show_progress = isatty(2);
 748
 749        if (0 < abbrev && abbrev < GIT_SHA1_HEXSZ)
 750                /* one more abbrev length is needed for the boundary commit */
 751                abbrev++;
 752        else if (!abbrev)
 753                abbrev = GIT_SHA1_HEXSZ;
 754
 755        if (revs_file && read_ancestry(revs_file))
 756                die_errno("reading graft file '%s' failed", revs_file);
 757
 758        if (cmd_is_annotate) {
 759                output_option |= OUTPUT_ANNOTATE_COMPAT;
 760                blame_date_mode.type = DATE_ISO8601;
 761        } else {
 762                blame_date_mode = revs.date_mode;
 763        }
 764
 765        /* The maximum width used to show the dates */
 766        switch (blame_date_mode.type) {
 767        case DATE_RFC2822:
 768                blame_date_width = sizeof("Thu, 19 Oct 2006 16:00:04 -0700");
 769                break;
 770        case DATE_ISO8601_STRICT:
 771                blame_date_width = sizeof("2006-10-19T16:00:04-07:00");
 772                break;
 773        case DATE_ISO8601:
 774                blame_date_width = sizeof("2006-10-19 16:00:04 -0700");
 775                break;
 776        case DATE_RAW:
 777                blame_date_width = sizeof("1161298804 -0700");
 778                break;
 779        case DATE_UNIX:
 780                blame_date_width = sizeof("1161298804");
 781                break;
 782        case DATE_SHORT:
 783                blame_date_width = sizeof("2006-10-19");
 784                break;
 785        case DATE_RELATIVE:
 786                /*
 787                 * TRANSLATORS: This string is used to tell us the
 788                 * maximum display width for a relative timestamp in
 789                 * "git blame" output.  For C locale, "4 years, 11
 790                 * months ago", which takes 22 places, is the longest
 791                 * among various forms of relative timestamps, but
 792                 * your language may need more or fewer display
 793                 * columns.
 794                 */
 795                blame_date_width = utf8_strwidth(_("4 years, 11 months ago")) + 1; /* add the null */
 796                break;
 797        case DATE_NORMAL:
 798                blame_date_width = sizeof("Thu Oct 19 16:00:04 2006 -0700");
 799                break;
 800        case DATE_STRFTIME:
 801                blame_date_width = strlen(show_date(0, 0, &blame_date_mode)) + 1; /* add the null */
 802                break;
 803        }
 804        blame_date_width -= 1; /* strip the null */
 805
 806        if (DIFF_OPT_TST(&revs.diffopt, FIND_COPIES_HARDER))
 807                opt |= (PICKAXE_BLAME_COPY | PICKAXE_BLAME_MOVE |
 808                        PICKAXE_BLAME_COPY_HARDER);
 809
 810        /*
 811         * We have collected options unknown to us in argv[1..unk]
 812         * which are to be passed to revision machinery if we are
 813         * going to do the "bottom" processing.
 814         *
 815         * The remaining are:
 816         *
 817         * (1) if dashdash_pos != 0, it is either
 818         *     "blame [revisions] -- <path>" or
 819         *     "blame -- <path> <rev>"
 820         *
 821         * (2) otherwise, it is one of the two:
 822         *     "blame [revisions] <path>"
 823         *     "blame <path> <rev>"
 824         *
 825         * Note that we must strip out <path> from the arguments: we do not
 826         * want the path pruning but we may want "bottom" processing.
 827         */
 828        if (dashdash_pos) {
 829                switch (argc - dashdash_pos - 1) {
 830                case 2: /* (1b) */
 831                        if (argc != 4)
 832                                usage_with_options(blame_opt_usage, options);
 833                        /* reorder for the new way: <rev> -- <path> */
 834                        argv[1] = argv[3];
 835                        argv[3] = argv[2];
 836                        argv[2] = "--";
 837                        /* FALLTHROUGH */
 838                case 1: /* (1a) */
 839                        path = add_prefix(prefix, argv[--argc]);
 840                        argv[argc] = NULL;
 841                        break;
 842                default:
 843                        usage_with_options(blame_opt_usage, options);
 844                }
 845        } else {
 846                if (argc < 2)
 847                        usage_with_options(blame_opt_usage, options);
 848                path = add_prefix(prefix, argv[argc - 1]);
 849                if (argc == 3 && !file_exists(path)) { /* (2b) */
 850                        path = add_prefix(prefix, argv[1]);
 851                        argv[1] = argv[2];
 852                }
 853                argv[argc - 1] = "--";
 854
 855                setup_work_tree();
 856                if (!file_exists(path))
 857                        die_errno("cannot stat path '%s'", path);
 858        }
 859
 860        revs.disable_stdin = 1;
 861        setup_revisions(argc, argv, &revs, NULL);
 862
 863        init_scoreboard(&sb);
 864        sb.revs = &revs;
 865        sb.contents_from = contents_from;
 866        sb.reverse = reverse;
 867        setup_scoreboard(&sb, path, &o);
 868        lno = sb.num_lines;
 869
 870        if (lno && !range_list.nr)
 871                string_list_append(&range_list, "1");
 872
 873        anchor = 1;
 874        range_set_init(&ranges, range_list.nr);
 875        for (range_i = 0; range_i < range_list.nr; ++range_i) {
 876                long bottom, top;
 877                if (parse_range_arg(range_list.items[range_i].string,
 878                                    nth_line_cb, &sb, lno, anchor,
 879                                    &bottom, &top, sb.path))
 880                        usage(blame_usage);
 881                if (lno < top || ((lno || bottom) && lno < bottom))
 882                        die(Q_("file %s has only %lu line",
 883                               "file %s has only %lu lines",
 884                               lno), path, lno);
 885                if (bottom < 1)
 886                        bottom = 1;
 887                if (top < 1)
 888                        top = lno;
 889                bottom--;
 890                range_set_append_unsafe(&ranges, bottom, top);
 891                anchor = top + 1;
 892        }
 893        sort_and_merge_range_set(&ranges);
 894
 895        for (range_i = ranges.nr; range_i > 0; --range_i) {
 896                const struct range *r = &ranges.ranges[range_i - 1];
 897                ent = blame_entry_prepend(ent, r->start, r->end, o);
 898        }
 899
 900        o->suspects = ent;
 901        prio_queue_put(&sb.commits, o->commit);
 902
 903        blame_origin_decref(o);
 904
 905        range_set_release(&ranges);
 906        string_list_clear(&range_list, 0);
 907
 908        sb.ent = NULL;
 909        sb.path = path;
 910
 911        if (blame_move_score)
 912                sb.move_score = blame_move_score;
 913        if (blame_copy_score)
 914                sb.copy_score = blame_copy_score;
 915
 916        sb.debug = DEBUG;
 917        sb.on_sanity_fail = &sanity_check_on_fail;
 918
 919        sb.show_root = show_root;
 920        sb.xdl_opts = xdl_opts;
 921        sb.no_whole_file_rename = no_whole_file_rename;
 922
 923        read_mailmap(&mailmap, NULL);
 924
 925        sb.found_guilty_entry = &found_guilty_entry;
 926        sb.found_guilty_entry_data = &pi;
 927        if (show_progress)
 928                pi.progress = start_delayed_progress(_("Blaming lines"), sb.num_lines);
 929
 930        assign_blame(&sb, opt);
 931
 932        stop_progress(&pi.progress);
 933
 934        if (!incremental)
 935                setup_pager();
 936        else
 937                return 0;
 938
 939        blame_sort_final(&sb);
 940
 941        blame_coalesce(&sb);
 942
 943        if (!(output_option & OUTPUT_PORCELAIN))
 944                find_alignment(&sb, &output_option);
 945
 946        output(&sb, output_option);
 947        free((void *)sb.final_buf);
 948        for (ent = sb.ent; ent; ) {
 949                struct blame_entry *e = ent->next;
 950                free(ent);
 951                ent = e;
 952        }
 953
 954        if (show_stats) {
 955                printf("num read blob: %d\n", sb.num_read_blob);
 956                printf("num get patch: %d\n", sb.num_get_patch);
 957                printf("num commits: %d\n", sb.num_commits);
 958        }
 959        return 0;
 960}