Skip to content

Commit

Permalink
blame: add support for --[no-]progress option
Browse files Browse the repository at this point in the history
Teach the command to show progress output when it takes long time to
produce the first line of output; this option cannot be used with
"--incremental" or "--porcelain" options.

git-annotate inherits the option as well.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Edmundo Carmona Antoranz <eantoranz@gmail.com>
Reviewed-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Edmundo Carmona Antoranz authored and Junio C Hamano committed Dec 16, 2015
1 parent 1aaf149 commit aba37f4
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 5 deletions.
7 changes: 7 additions & 0 deletions Documentation/blame-options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,13 @@ include::line-range-format.txt[]
iso format is used. For more information, See the discussion
of the --date option at linkgit:git-log[1].

--[no-]progress::
Progress status is reported on the standard error stream
by default when it is attached to a terminal. This flag
enables progress reporting even if not attached to a
terminal. Can't use `--progress` together with `--porcelain`
or `--incremental`.

-M|<num>|::
Detect moved or copied lines within a file. When a commit
moves or copies a block of lines (e.g. the original file
Expand Down
3 changes: 2 additions & 1 deletion Documentation/git-blame.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ SYNOPSIS
[verse]
'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
[-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>]
[--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>] [--] <file>
[--progress] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>]
[--] <file>

DESCRIPTION
-----------
Expand Down
34 changes: 30 additions & 4 deletions builtin/blame.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>");

Expand All @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
Expand All @@ -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);
}

/*
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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,
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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);
Expand All @@ -2572,6 +2591,13 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
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++;
Expand Down Expand Up @@ -2797,11 +2823,11 @@ int cmd_blame(int argc, const char **argv, const char *prefix)

read_mailmap(&mailmap, NULL);

assign_blame(&sb, opt);

if (!incremental)
setup_pager();

assign_blame(&sb, opt);

free(final_commit_name);

if (incremental)
Expand Down

0 comments on commit aba37f4

Please sign in to comment.