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 optionmaint
						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
	
	 Junio C Hamano
						Junio C Hamano