git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] difftool: Change prompt to display the number of files in the diff queue
@ 2013-12-05 23:38 Zoltan Klinger
  2013-12-06 22:00 ` Junio C Hamano
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Zoltan Klinger @ 2013-12-05 23:38 UTC (permalink / raw)
  To: git; +Cc: sunshine, gitster, Zoltan Klinger

When --prompt option is set, git-difftool displays a prompt for each modified
file to be viewed in an external diff program. At that point it could be useful
to display a counter and the total number of files in the diff queue.

Below is the current difftool prompt for the first of 5 modified files:
Viewing: 'diff.c'
Launch 'vimdiff' [Y/n]:

Consider the modified prompt:
Viewing (1/5): 'diff.c'
Launch 'vimdiff' [Y/n]:

The current GIT_EXTERNAL_DIFF mechanism does not tell the number of
paths in the diff queue nor the current counter. To make this
"counter/total" info available for GIT_EXTERNAL_DIFF programs without
breaking existing ones:

(1) Modify run_external_diff() function in diff.c to set one environment
variable for a counter and one for the total number of files in the diff
queue. The size of the diff queue is already available in the
diff_queue_struct. For the counter define a new variable in the
diff_options struct and reset it to zero in diff_setup_done() function.
Pre-increment the counter inside the run_external_diff() function.

(2) Modify git-difftool--helper.sh script to display the counter and the diff
queue count values in the difftool prompt.

(3) Update git.txt documentation

(4) Update t4020-diff-external.sh test script

Signed-off-by: Zoltan Klinger <zoltan.klinger@gmail.com>
---

Reworked patch to use run_command_v_opt_cd_env() function when invoking
the external diff program. Modified test script to use write_script
helper function.

 Documentation/git.txt    |  9 +++++++++
 diff.c                   | 20 +++++++++++++++++---
 diff.h                   |  2 ++
 git-difftool--helper.sh  |  3 ++-
 t/t4020-diff-external.sh | 14 ++++++++++++++
 5 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/Documentation/git.txt b/Documentation/git.txt
index 4448ce2..10939ac 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -806,6 +806,15 @@ temporary file --- it is removed when 'GIT_EXTERNAL_DIFF' exits.
 +
 For a path that is unmerged, 'GIT_EXTERNAL_DIFF' is called with 1
 parameter, <path>.
++
+For each path 'GIT_EXTERNAL_DIFF' is called, two environment variables,
+'GIT_DIFF_PATH_COUNTER' and 'GIT_DIFF_PATH_TOTAL' are set.
+
+'GIT_DIFF_PATH_COUNTER'::
+	A 1-based counter incremented by one for every path.
+
+'GIT_DIFF_PATH_TOTAL'::
+	The total number of paths.
 
 other
 ~~~~~
diff --git a/diff.c b/diff.c
index e34bf97..a7d5a47 100644
--- a/diff.c
+++ b/diff.c
@@ -2899,11 +2899,16 @@ static void run_external_diff(const char *pgm,
 			      struct diff_filespec *one,
 			      struct diff_filespec *two,
 			      const char *xfrm_msg,
-			      int complete_rewrite)
+			      int complete_rewrite,
+			      struct diff_options *o)
 {
 	const char *spawn_arg[10];
 	int retval;
 	const char **arg = &spawn_arg[0];
+	struct diff_queue_struct *q = &diff_queued_diff;
+	const char *env[3] = { NULL };
+	char env_counter[50];
+	char env_total[50];
 
 	if (one && two) {
 		struct diff_tempfile *temp_one, *temp_two;
@@ -2928,7 +2933,14 @@ static void run_external_diff(const char *pgm,
 	}
 	*arg = NULL;
 	fflush(NULL);
-	retval = run_command_v_opt(spawn_arg, RUN_USING_SHELL);
+
+	env[0] = env_counter;
+	snprintf(env_counter, sizeof(env_counter), "GIT_DIFF_PATH_COUNTER=%d",
+			++o->diff_path_counter);
+	env[1] = env_total;
+	snprintf(env_total, sizeof(env_total), "GIT_DIFF_PATH_TOTAL=%d", q->nr);
+
+	retval = run_command_v_opt_cd_env(spawn_arg, RUN_USING_SHELL, NULL, env);
 	remove_tempfile();
 	if (retval) {
 		fprintf(stderr, "external diff died, stopping at %s.\n", name);
@@ -3042,7 +3054,7 @@ static void run_diff_cmd(const char *pgm,
 
 	if (pgm) {
 		run_external_diff(pgm, name, other, one, two, xfrm_msg,
-				  complete_rewrite);
+				  complete_rewrite, o);
 		return;
 	}
 	if (one && two)
@@ -3317,6 +3329,8 @@ void diff_setup_done(struct diff_options *options)
 		options->output_format = DIFF_FORMAT_NO_OUTPUT;
 		DIFF_OPT_SET(options, EXIT_WITH_STATUS);
 	}
+
+    options->diff_path_counter = 0;
 }
 
 static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val)
diff --git a/diff.h b/diff.h
index e342325..42bd34c 100644
--- a/diff.h
+++ b/diff.h
@@ -164,6 +164,8 @@ struct diff_options {
 	diff_prefix_fn_t output_prefix;
 	int output_prefix_length;
 	void *output_prefix_data;
+
+	int diff_path_counter;
 };
 
 enum color_diff {
diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh
index b00ed95..7ef36b9 100755
--- a/git-difftool--helper.sh
+++ b/git-difftool--helper.sh
@@ -40,7 +40,8 @@ launch_merge_tool () {
 	# the user with the real $MERGED name before launching $merge_tool.
 	if should_prompt
 	then
-		printf "\nViewing: '%s'\n" "$MERGED"
+		printf "\nViewing (%s/%s): '%s'\n" "$GIT_DIFF_PATH_COUNTER" \
+			"$GIT_DIFF_PATH_TOTAL" "$MERGED"
 		if use_ext_cmd
 		then
 			printf "Launch '%s' [Y/n]: " \
diff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh
index 8a30979..1855d31 100755
--- a/t/t4020-diff-external.sh
+++ b/t/t4020-diff-external.sh
@@ -193,6 +193,20 @@ test_expect_success 'GIT_EXTERNAL_DIFF with more than one changed files' '
 	GIT_EXTERNAL_DIFF=echo git diff
 '
 
+write_script external-diff.sh <<\EOF
+echo $GIT_DIFF_PATH_COUNTER of $GIT_DIFF_PATH_TOTAL >>counter.txt
+EOF
+
+test_expect_success 'GIT_EXTERNAL_DIFF path counter/total' '
+	GIT_EXTERNAL_DIFF=./external-diff.sh git diff &&
+	echo "1 of 2" >expect &&
+	head -n 1 counter.txt >actual &&
+	test_cmp expect actual &&
+	echo "2 of 2" >expect &&
+	tail -n 1 counter.txt >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'GIT_EXTERNAL_DIFF generates pretty paths' '
 	touch file.ext &&
 	git add file.ext &&
-- 
1.8.4.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v3] difftool: Change prompt to display the number of files in the diff queue
  2013-12-05 23:38 [PATCH v3] difftool: Change prompt to display the number of files in the diff queue Zoltan Klinger
@ 2013-12-06 22:00 ` Junio C Hamano
  2013-12-16 20:02 ` Jeff King
  2013-12-18  5:25 ` David Aguilar
  2 siblings, 0 replies; 6+ messages in thread
From: Junio C Hamano @ 2013-12-06 22:00 UTC (permalink / raw)
  To: Zoltan Klinger; +Cc: git, sunshine

Zoltan Klinger <zoltan.klinger@gmail.com> writes:

> Reworked patch to use run_command_v_opt_cd_env() function when invoking
> the external diff program. Modified test script to use write_script
> helper function.

Thanks; will queue with a minor tweak.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3] difftool: Change prompt to display the number of files in the diff queue
  2013-12-05 23:38 [PATCH v3] difftool: Change prompt to display the number of files in the diff queue Zoltan Klinger
  2013-12-06 22:00 ` Junio C Hamano
@ 2013-12-16 20:02 ` Jeff King
  2013-12-16 21:04   ` Junio C Hamano
  2013-12-18  5:25 ` David Aguilar
  2 siblings, 1 reply; 6+ messages in thread
From: Jeff King @ 2013-12-16 20:02 UTC (permalink / raw)
  To: Zoltan Klinger; +Cc: git, sunshine, gitster

On Fri, Dec 06, 2013 at 10:38:46AM +1100, Zoltan Klinger wrote:

> @@ -2928,7 +2933,14 @@ static void run_external_diff(const char *pgm,
>  	}
>  	*arg = NULL;
>  	fflush(NULL);
> -	retval = run_command_v_opt(spawn_arg, RUN_USING_SHELL);
> +
> +	env[0] = env_counter;
> +	snprintf(env_counter, sizeof(env_counter), "GIT_DIFF_PATH_COUNTER=%d",
> +			++o->diff_path_counter);

I don't think we have a particular rule, but our usual style is to line
up the continued line of arguments with the open-paren of the function,
like:

  foo(arg1, arg2,
      arg3, arg4);

> @@ -3317,6 +3329,8 @@ void diff_setup_done(struct diff_options *options)
>  		options->output_format = DIFF_FORMAT_NO_OUTPUT;
>  		DIFF_OPT_SET(options, EXIT_WITH_STATUS);
>  	}
> +
> +    options->diff_path_counter = 0;

It's hard to see with the email quoting, but this is a 4-space indent
rather than the usual 1-tab (which should be 8-wide on the terminals of
all True Believers).


Both are minor, but worth fixing IMHO (especially the second one). Looks
like it's too late for squashing, so here's a patch that can go on top
(doing it now is still of value, though, as it's less likely to create
conflicts since nobody is building on top yet).

-- >8 --
Subject: diff.c: fix some recent whitespace style violations

These were introduced by ee7fb0b.

Signed-off-by: Jeff King <peff@peff.net>
---
On top of zk/difftool-counts.

 diff.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/diff.c b/diff.c
index a7d5a47..d69cc1b 100644
--- a/diff.c
+++ b/diff.c
@@ -2936,7 +2936,7 @@ static void run_external_diff(const char *pgm,
 
 	env[0] = env_counter;
 	snprintf(env_counter, sizeof(env_counter), "GIT_DIFF_PATH_COUNTER=%d",
-			++o->diff_path_counter);
+		 ++o->diff_path_counter);
 	env[1] = env_total;
 	snprintf(env_total, sizeof(env_total), "GIT_DIFF_PATH_TOTAL=%d", q->nr);
 
@@ -3330,7 +3330,7 @@ void diff_setup_done(struct diff_options *options)
 		DIFF_OPT_SET(options, EXIT_WITH_STATUS);
 	}
 
-    options->diff_path_counter = 0;
+	options->diff_path_counter = 0;
 }
 
 static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val)
-- 
1.8.5.1.399.g900e7cd

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v3] difftool: Change prompt to display the number of files in the diff queue
  2013-12-16 20:02 ` Jeff King
@ 2013-12-16 21:04   ` Junio C Hamano
  0 siblings, 0 replies; 6+ messages in thread
From: Junio C Hamano @ 2013-12-16 21:04 UTC (permalink / raw)
  To: Jeff King; +Cc: Zoltan Klinger, git, sunshine

Thanks.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3] difftool: Change prompt to display the number of files in the diff queue
  2013-12-05 23:38 [PATCH v3] difftool: Change prompt to display the number of files in the diff queue Zoltan Klinger
  2013-12-06 22:00 ` Junio C Hamano
  2013-12-16 20:02 ` Jeff King
@ 2013-12-18  5:25 ` David Aguilar
  2013-12-18  6:06   ` Junio C Hamano
  2 siblings, 1 reply; 6+ messages in thread
From: David Aguilar @ 2013-12-18  5:25 UTC (permalink / raw)
  To: Zoltan Klinger; +Cc: git, sunshine, gitster

Thanks for the patch, and sorry for the late response.
I have just a couple of notes below...

On Fri, Dec 06, 2013 at 10:38:46AM +1100, Zoltan Klinger wrote:
> diff --git a/diff.c b/diff.c
> index e34bf97..a7d5a47 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -2899,11 +2899,16 @@ static void run_external_diff(const char *pgm,
>  			      struct diff_filespec *one,
>  			      struct diff_filespec *two,
>  			      const char *xfrm_msg,
> -			      int complete_rewrite)
> +			      int complete_rewrite,
> +			      struct diff_options *o)

Very minor nit -- "o" is a very terse variable name.
Maybe "opts"?

>  {
>  	const char *spawn_arg[10];
>  	int retval;
>  	const char **arg = &spawn_arg[0];
> +	struct diff_queue_struct *q = &diff_queued_diff;
> +	const char *env[3] = { NULL };
> +	char env_counter[50];
> +	char env_total[50];

Hard-coded 50; what's the length of the maximum signed int?


> diff --git a/diff.h b/diff.h
> index e342325..42bd34c 100644
> --- a/diff.h
> +++ b/diff.h
> @@ -164,6 +164,8 @@ struct diff_options {
>  	diff_prefix_fn_t output_prefix;
>  	int output_prefix_length;
>  	void *output_prefix_data;
> +
> +	int diff_path_counter;
>  };

Since these are already "diff_options" it seems redundant to call
the struct entry the "diff_path_counter" when "path_count"
should be specific enough.  Would it make sense to rename it?

These are tiny nitpicky style notes; it looks good otherwise.

Thanks,
-- 
David

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3] difftool: Change prompt to display the number of files in the diff queue
  2013-12-18  5:25 ` David Aguilar
@ 2013-12-18  6:06   ` Junio C Hamano
  0 siblings, 0 replies; 6+ messages in thread
From: Junio C Hamano @ 2013-12-18  6:06 UTC (permalink / raw)
  To: David Aguilar; +Cc: Zoltan Klinger, git, sunshine

David Aguilar <davvid@gmail.com> writes:

> Thanks for the patch, and sorry for the late response.
> I have just a couple of notes below...
>
> On Fri, Dec 06, 2013 at 10:38:46AM +1100, Zoltan Klinger wrote:
>> diff --git a/diff.c b/diff.c
>> index e34bf97..a7d5a47 100644
>> --- a/diff.c
>> +++ b/diff.c
>> @@ -2899,11 +2899,16 @@ static void run_external_diff(const char *pgm,
>>  			      struct diff_filespec *one,
>>  			      struct diff_filespec *two,
>>  			      const char *xfrm_msg,
>> -			      int complete_rewrite)
>> +			      int complete_rewrite,
>> +			      struct diff_options *o)
>
> Very minor nit -- "o" is a very terse variable name.
> Maybe "opts"?

The diff-options parameter passed around in the callchain has always
been "o" throughout this file from the beginning of time, though ;-).

>
>>  {
>>  	const char *spawn_arg[10];
>>  	int retval;
>>  	const char **arg = &spawn_arg[0];
>> +	struct diff_queue_struct *q = &diff_queued_diff;
>> +	const char *env[3] = { NULL };
>> +	char env_counter[50];
>> +	char env_total[50];
>
> Hard-coded 50; what's the length of the maximum signed int?

;-) A bit of slack is fine, but 50 might be excessive (more than
twice as big as necessary).

>> diff --git a/diff.h b/diff.h
>> index e342325..42bd34c 100644
>> --- a/diff.h
>> +++ b/diff.h
>> @@ -164,6 +164,8 @@ struct diff_options {
>>  	diff_prefix_fn_t output_prefix;
>>  	int output_prefix_length;
>>  	void *output_prefix_data;
>> +
>> +	int diff_path_counter;
>>  };
>
> Since these are already "diff_options" it seems redundant to call
> the struct entry the "diff_path_counter" when "path_count"
> should be specific enough.  Would it make sense to rename it?

Yeah, makes sense.  diff_options->diff_path_counter++ sounds awful,
while options->path_count++ looks quite tame and reasonable.

> These are tiny nitpicky style notes; it looks good otherwise.

Thanks.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-12-18  6:06 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-05 23:38 [PATCH v3] difftool: Change prompt to display the number of files in the diff queue Zoltan Klinger
2013-12-06 22:00 ` Junio C Hamano
2013-12-16 20:02 ` Jeff King
2013-12-16 21:04   ` Junio C Hamano
2013-12-18  5:25 ` David Aguilar
2013-12-18  6:06   ` Junio C Hamano

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 NNTP newsgroup(s).