* [PATCH v7] blame: add support for --[no-]progress option
@ 2015-12-13 0:51 Edmundo Carmona Antoranz
2015-12-16 7:47 ` Eric Sunshine
0 siblings, 1 reply; 2+ messages in thread
From: Edmundo Carmona Antoranz @ 2015-12-13 0:51 UTC (permalink / raw)
To: git; +Cc: gitster, j6t, tboegi, sunshine, Edmundo Carmona Antoranz
--progress can't be used with --incremental or
porcelain formats.
git-annotate inherits the option as well
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Edmundo Carmona Antoranz <eantoranz@gmail.com>
---
Documentation/blame-options.txt | 7 +++++++
Documentation/git-blame.txt | 3 ++-
builtin/blame.c | 34 ++++++++++++++++++++++++++++++----
3 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index 760eab7..02cb684 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -69,6 +69,13 @@ include::line-range-format.txt[]
iso format is used. For supported values, 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
diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt
index e6e947c..ba54175 100644
--- a/Documentation/git-blame.txt
+++ b/Documentation/git-blame.txt
@@ -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
-----------
diff --git a/builtin/blame.c b/builtin/blame.c
index 2afe828..e78ca09 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -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;
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 {
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)
{
@@ -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.
* 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;
@@ -1758,6 +1766,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);
}
/*
@@ -1768,6 +1778,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;
@@ -1809,7 +1824,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;
@@ -1825,6 +1840,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,
@@ -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(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),
@@ -2555,6 +2573,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);
@@ -2579,6 +2598,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++;
@@ -2828,11 +2854,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)
--
2.6.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v7] blame: add support for --[no-]progress option
2015-12-13 0:51 [PATCH v7] blame: add support for --[no-]progress option Edmundo Carmona Antoranz
@ 2015-12-16 7:47 ` Eric Sunshine
0 siblings, 0 replies; 2+ messages in thread
From: Eric Sunshine @ 2015-12-16 7:47 UTC (permalink / raw)
To: Edmundo Carmona Antoranz
Cc: Git List, Junio C Hamano, Johannes Sixt,
Torsten Bögershausen
On Sat, Dec 12, 2015 at 7:51 PM, Edmundo Carmona Antoranz
<eantoranz@gmail.com> wrote:
> --progress can't be used with --incremental or
> porcelain formats.
>
> git-annotate inherits the option as well
>
> Helped-by: Eric Sunshine <sunshine@sunshineco.com>
> Signed-off-by: Edmundo Carmona Antoranz <eantoranz@gmail.com>
> ---
This version seems to address all the issues raised in my reviews of
previous rounds, and the new code is more concise, well-formed, and
easier to follow than earlier attempts. Thanks.
For the sake of other reviewers, recent previous versions and reviews are here:
v6: http://thread.gmane.org/gmane.comp.version-control.git/282305
v5: http://thread.gmane.org/gmane.comp.version-control.git/281677
> diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
> index 760eab7..02cb684 100644
> --- a/Documentation/blame-options.txt
> +++ b/Documentation/blame-options.txt
> @@ -69,6 +69,13 @@ include::line-range-format.txt[]
> iso format is used. For supported values, 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
> diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt
> index e6e947c..ba54175 100644
> --- a/Documentation/git-blame.txt
> +++ b/Documentation/git-blame.txt
> @@ -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
> -----------
> diff --git a/builtin/blame.c b/builtin/blame.c
> index 2afe828..e78ca09 100644
> --- a/builtin/blame.c
> +++ b/builtin/blame.c
> @@ -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;
> 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 {
> 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)
> {
> @@ -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.
> * 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;
> @@ -1758,6 +1766,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);
> }
>
> /*
> @@ -1768,6 +1778,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;
> @@ -1809,7 +1824,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;
> @@ -1825,6 +1840,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,
> @@ -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(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),
> @@ -2555,6 +2573,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);
> @@ -2579,6 +2598,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++;
> @@ -2828,11 +2854,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)
> --
> 2.6.2
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-12-16 7:47 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-13 0:51 [PATCH v7] blame: add support for --[no-]progress option Edmundo Carmona Antoranz
2015-12-16 7:47 ` Eric Sunshine
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).