@ -28,6 +28,7 @@
@@ -28,6 +28,7 @@
#include "line-range.h"
#include "line-log.h"
#include "dir.h"
#include "progress.h"
static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
@ -50,6 +51,7 @@ static int incremental;
@@ -50,6 +51,7 @@ static int incremental;
static int xdl_opts;
static int abbrev = -1;
static int no_whole_file_rename;
static int show_progress;
static struct date_mode blame_date_mode = { DATE_ISO8601 };
static size_t blame_date_width;
@ -127,6 +129,11 @@ struct origin {
@@ -127,6 +129,11 @@ struct origin {
char path[FLEX_ARRAY];
};
struct progress_info {
struct progress *progress;
int blamed_lines;
};
static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b, long ctxlen,
xdl_emit_hunk_consume_func_t hunk_func, void *cb_data)
{
@ -1745,7 +1752,8 @@ static int emit_one_suspect_detail(struct origin *suspect, int repeat)
@@ -1745,7 +1752,8 @@ static int emit_one_suspect_detail(struct origin *suspect, int repeat)
* The blame_entry is found to be guilty for the range.
* Show it in incremental output.
*/
static void found_guilty_entry(struct blame_entry *ent)
static void found_guilty_entry(struct blame_entry *ent,
struct progress_info *pi)
{
if (incremental) {
struct origin *suspect = ent->suspect;
@ -1757,6 +1765,8 @@ static void found_guilty_entry(struct blame_entry *ent)
@@ -1757,6 +1765,8 @@ static void found_guilty_entry(struct blame_entry *ent)
write_filename_info(suspect->path);
maybe_flush_or_die(stdout, "stdout");
}
pi->blamed_lines += ent->num_lines;
display_progress(pi->progress, pi->blamed_lines);
}
/*
@ -1767,6 +1777,11 @@ static void assign_blame(struct scoreboard *sb, int opt)
@@ -1767,6 +1777,11 @@ static void assign_blame(struct scoreboard *sb, int opt)
{
struct rev_info *revs = sb->revs;
struct commit *commit = prio_queue_get(&sb->commits);
struct progress_info pi = { NULL, 0 };
if (show_progress)
pi.progress = start_progress_delay(_("Blaming lines"),
sb->num_lines, 50, 1);
while (commit) {
struct blame_entry *ent;
@ -1808,7 +1823,7 @@ static void assign_blame(struct scoreboard *sb, int opt)
@@ -1808,7 +1823,7 @@ static void assign_blame(struct scoreboard *sb, int opt)
suspect->guilty = 1;
for (;;) {
struct blame_entry *next = ent->next;
found_guilty_entry(ent);
found_guilty_entry(ent, &pi);
if (next) {
ent = next;
continue;
@ -1824,6 +1839,8 @@ static void assign_blame(struct scoreboard *sb, int opt)
@@ -1824,6 +1839,8 @@ static void assign_blame(struct scoreboard *sb, int opt)
if (DEBUG) /* sanity */
sanity_check_refcnt(sb);
}
stop_progress(&pi.progress);
}
static const char *format_time(unsigned long time, const char *tz_str,
@ -2513,6 +2530,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
@@ -2513,6 +2530,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
OPT_BOOL('b', NULL, &blank_boundary, N_("Show blank SHA-1 for boundary commits (Default: off)")),
OPT_BOOL(0, "root", &show_root, N_("Do not treat root commits as boundaries (Default: off)")),
OPT_BOOL(0, "show-stats", &show_stats, N_("Show work cost statistics")),
OPT_BOOL(0, "progress", &show_progress, N_("Force progress reporting")),
OPT_BIT(0, "score-debug", &output_option, N_("Show output score for blame entries"), OUTPUT_SHOW_SCORE),
OPT_BIT('f', "show-name", &output_option, N_("Show original filename (Default: auto)"), OUTPUT_SHOW_NAME),
OPT_BIT('n', "show-number", &output_option, N_("Show original linenumber (Default: off)"), OUTPUT_SHOW_NUMBER),
@ -2548,6 +2566,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
@@ -2548,6 +2566,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
save_commit_buffer = 0;
dashdash_pos = 0;
show_progress = -1;
parse_options_start(&ctx, argc, argv, prefix, options,
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0);
@ -2572,6 +2591,13 @@ parse_done:
@@ -2572,6 +2591,13 @@ parse_done:
DIFF_OPT_CLR(&revs.diffopt, FOLLOW_RENAMES);
argc = parse_options_end(&ctx);
if (incremental || (output_option & OUTPUT_PORCELAIN)) {
if (show_progress > 0)
die("--progress can't be used with --incremental or porcelain formats");
show_progress = 0;
} else if (show_progress < 0)
show_progress = isatty(2);
if (0 < abbrev)
/* one more abbrev length is needed for the boundary commit */
abbrev++;
@ -2797,11 +2823,11 @@ parse_done:
@@ -2797,11 +2823,11 @@ parse_done:
read_mailmap(&mailmap, NULL);
assign_blame(&sb, opt);
if (!incremental)
setup_pager();
assign_blame(&sb, opt);
free(final_commit_name);
if (incremental)