Merge branch 'ea/blame-progress'
"git blame" learned to produce the progress eye-candy when it takes too much time before emitting the first line of the result. * ea/blame-progress: blame: add support for --[no-]progress option
This commit is contained in:
commit
72d25911eb
@ -69,6 +69,13 @@ include::line-range-format.txt[]
|
|||||||
iso format is used. For supported values, see the discussion
|
iso format is used. For supported values, see the discussion
|
||||||
of the --date option at linkgit:git-log[1].
|
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>|::
|
-M|<num>|::
|
||||||
Detect moved or copied lines within a file. When a commit
|
Detect moved or copied lines within a file. When a commit
|
||||||
moves or copies a block of lines (e.g. the original file
|
moves or copies a block of lines (e.g. the original file
|
||||||
|
@ -10,7 +10,8 @@ SYNOPSIS
|
|||||||
[verse]
|
[verse]
|
||||||
'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
|
'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>]
|
[-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
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "line-range.h"
|
#include "line-range.h"
|
||||||
#include "line-log.h"
|
#include "line-log.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
|
#include "progress.h"
|
||||||
|
|
||||||
static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
|
static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
|
||||||
|
|
||||||
@ -50,6 +51,7 @@ static int incremental;
|
|||||||
static int xdl_opts;
|
static int xdl_opts;
|
||||||
static int abbrev = -1;
|
static int abbrev = -1;
|
||||||
static int no_whole_file_rename;
|
static int no_whole_file_rename;
|
||||||
|
static int show_progress;
|
||||||
|
|
||||||
static struct date_mode blame_date_mode = { DATE_ISO8601 };
|
static struct date_mode blame_date_mode = { DATE_ISO8601 };
|
||||||
static size_t blame_date_width;
|
static size_t blame_date_width;
|
||||||
@ -127,6 +129,11 @@ struct origin {
|
|||||||
char path[FLEX_ARRAY];
|
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,
|
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)
|
xdl_emit_hunk_consume_func_t hunk_func, void *cb_data)
|
||||||
{
|
{
|
||||||
@ -1746,7 +1753,8 @@ static int emit_one_suspect_detail(struct origin *suspect, int repeat)
|
|||||||
* The blame_entry is found to be guilty for the range.
|
* The blame_entry is found to be guilty for the range.
|
||||||
* Show it in incremental output.
|
* 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) {
|
if (incremental) {
|
||||||
struct origin *suspect = ent->suspect;
|
struct origin *suspect = ent->suspect;
|
||||||
@ -1758,6 +1766,8 @@ static void found_guilty_entry(struct blame_entry *ent)
|
|||||||
write_filename_info(suspect->path);
|
write_filename_info(suspect->path);
|
||||||
maybe_flush_or_die(stdout, "stdout");
|
maybe_flush_or_die(stdout, "stdout");
|
||||||
}
|
}
|
||||||
|
pi->blamed_lines += ent->num_lines;
|
||||||
|
display_progress(pi->progress, pi->blamed_lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1768,6 +1778,11 @@ static void assign_blame(struct scoreboard *sb, int opt)
|
|||||||
{
|
{
|
||||||
struct rev_info *revs = sb->revs;
|
struct rev_info *revs = sb->revs;
|
||||||
struct commit *commit = prio_queue_get(&sb->commits);
|
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) {
|
while (commit) {
|
||||||
struct blame_entry *ent;
|
struct blame_entry *ent;
|
||||||
@ -1809,7 +1824,7 @@ static void assign_blame(struct scoreboard *sb, int opt)
|
|||||||
suspect->guilty = 1;
|
suspect->guilty = 1;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
struct blame_entry *next = ent->next;
|
struct blame_entry *next = ent->next;
|
||||||
found_guilty_entry(ent);
|
found_guilty_entry(ent, &pi);
|
||||||
if (next) {
|
if (next) {
|
||||||
ent = next;
|
ent = next;
|
||||||
continue;
|
continue;
|
||||||
@ -1825,6 +1840,8 @@ static void assign_blame(struct scoreboard *sb, int opt)
|
|||||||
if (DEBUG) /* sanity */
|
if (DEBUG) /* sanity */
|
||||||
sanity_check_refcnt(sb);
|
sanity_check_refcnt(sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stop_progress(&pi.progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *format_time(unsigned long time, const char *tz_str,
|
static const char *format_time(unsigned long time, const char *tz_str,
|
||||||
@ -2520,6 +2537,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('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, "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, "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(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('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),
|
OPT_BIT('n', "show-number", &output_option, N_("Show original linenumber (Default: off)"), OUTPUT_SHOW_NUMBER),
|
||||||
@ -2555,6 +2573,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
|
|||||||
|
|
||||||
save_commit_buffer = 0;
|
save_commit_buffer = 0;
|
||||||
dashdash_pos = 0;
|
dashdash_pos = 0;
|
||||||
|
show_progress = -1;
|
||||||
|
|
||||||
parse_options_start(&ctx, argc, argv, prefix, options,
|
parse_options_start(&ctx, argc, argv, prefix, options,
|
||||||
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0);
|
PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0);
|
||||||
@ -2579,6 +2598,13 @@ parse_done:
|
|||||||
DIFF_OPT_CLR(&revs.diffopt, FOLLOW_RENAMES);
|
DIFF_OPT_CLR(&revs.diffopt, FOLLOW_RENAMES);
|
||||||
argc = parse_options_end(&ctx);
|
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)
|
if (0 < abbrev)
|
||||||
/* one more abbrev length is needed for the boundary commit */
|
/* one more abbrev length is needed for the boundary commit */
|
||||||
abbrev++;
|
abbrev++;
|
||||||
@ -2828,11 +2854,11 @@ parse_done:
|
|||||||
|
|
||||||
read_mailmap(&mailmap, NULL);
|
read_mailmap(&mailmap, NULL);
|
||||||
|
|
||||||
|
assign_blame(&sb, opt);
|
||||||
|
|
||||||
if (!incremental)
|
if (!incremental)
|
||||||
setup_pager();
|
setup_pager();
|
||||||
|
|
||||||
assign_blame(&sb, opt);
|
|
||||||
|
|
||||||
free(final_commit_name);
|
free(final_commit_name);
|
||||||
|
|
||||||
if (incremental)
|
if (incremental)
|
||||||
|
Loading…
Reference in New Issue
Block a user