Skip to content

Commit

Permalink
Merge branch 'zk/difftool-counts'
Browse files Browse the repository at this point in the history
Show the total number of paths and the number of paths shown so far
when "git difftool" prompts to launch an external diff tool, which
would give users some sense of progress.

* zk/difftool-counts:
  diff.c: fix some recent whitespace style violations
  difftool: display the number of files in the diff queue in the prompt
  • Loading branch information
Junio C Hamano committed Dec 27, 2013
2 parents 604ada4 + 0ea7d5b commit 6904f9a
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 4 deletions.
9 changes: 9 additions & 0 deletions Documentation/git.txt
Original file line number Diff line number Diff line change
Expand Up @@ -807,6 +807,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
~~~~~
Expand Down
20 changes: 17 additions & 3 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions diff.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
3 changes: 2 additions & 1 deletion git-difftool--helper.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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]: " \
Expand Down
13 changes: 13 additions & 0 deletions t/t4020-diff-external.sh
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,19 @@ test_expect_success 'GIT_EXTERNAL_DIFF with more than one changed files' '
GIT_EXTERNAL_DIFF=echo git diff
'

test_expect_success 'GIT_EXTERNAL_DIFF path counter/total' '
write_script external-diff.sh <<-\EOF &&
echo $GIT_DIFF_PATH_COUNTER of $GIT_DIFF_PATH_TOTAL >>counter.txt
EOF
>counter.txt &&
cat >expect <<-\EOF &&
1 of 2
2 of 2
EOF
GIT_EXTERNAL_DIFF=./external-diff.sh git diff &&
test_cmp expect counter.txt
'

test_expect_success 'GIT_EXTERNAL_DIFF generates pretty paths' '
touch file.ext &&
git add file.ext &&
Expand Down

0 comments on commit 6904f9a

Please sign in to comment.