diff --stat: color output.
Under --color option, diffstat shows '+' and '-' in the graph the same color as added and deleted lines. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
a2540023dc
commit
785f743276
29
diff.c
29
diff.c
@ -555,17 +555,20 @@ static int scale_linear(int it, int width, int max_change)
|
|||||||
return (it * width * 2 + max_change) / (max_change * 2);
|
return (it * width * 2 + max_change) / (max_change * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_name(const char *prefix, const char *name, int len)
|
static void show_name(const char *prefix, const char *name, int len,
|
||||||
|
const char *reset, const char *set)
|
||||||
{
|
{
|
||||||
printf(" %s%-*s |", prefix, len, name);
|
printf(" %s%s%-*s%s |", set, prefix, len, name, reset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_graph(char ch, int cnt)
|
static void show_graph(char ch, int cnt, const char *set, const char *reset)
|
||||||
{
|
{
|
||||||
if (cnt <= 0)
|
if (cnt <= 0)
|
||||||
return;
|
return;
|
||||||
|
printf("%s", set);
|
||||||
while (cnt--)
|
while (cnt--)
|
||||||
putchar(ch);
|
putchar(ch);
|
||||||
|
printf("%s", reset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_stats(struct diffstat_t* data, struct diff_options *options)
|
static void show_stats(struct diffstat_t* data, struct diff_options *options)
|
||||||
@ -574,6 +577,7 @@ static void show_stats(struct diffstat_t* data, struct diff_options *options)
|
|||||||
int max_change = 0, max_len = 0;
|
int max_change = 0, max_len = 0;
|
||||||
int total_files = data->nr;
|
int total_files = data->nr;
|
||||||
int width, name_width;
|
int width, name_width;
|
||||||
|
const char *reset, *set, *add_c, *del_c;
|
||||||
|
|
||||||
if (data->nr == 0)
|
if (data->nr == 0)
|
||||||
return;
|
return;
|
||||||
@ -592,6 +596,11 @@ static void show_stats(struct diffstat_t* data, struct diff_options *options)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Find the longest filename and max number of changes */
|
/* Find the longest filename and max number of changes */
|
||||||
|
reset = diff_get_color(options->color_diff, DIFF_RESET);
|
||||||
|
set = diff_get_color(options->color_diff, DIFF_PLAIN);
|
||||||
|
add_c = diff_get_color(options->color_diff, DIFF_FILE_NEW);
|
||||||
|
del_c = diff_get_color(options->color_diff, DIFF_FILE_OLD);
|
||||||
|
|
||||||
for (i = 0; i < data->nr; i++) {
|
for (i = 0; i < data->nr; i++) {
|
||||||
struct diffstat_file *file = data->files[i];
|
struct diffstat_file *file = data->files[i];
|
||||||
int change = file->added + file->deleted;
|
int change = file->added + file->deleted;
|
||||||
@ -650,12 +659,12 @@ static void show_stats(struct diffstat_t* data, struct diff_options *options)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data->files[i]->is_binary) {
|
if (data->files[i]->is_binary) {
|
||||||
show_name(prefix, name, len);
|
show_name(prefix, name, len, reset, set);
|
||||||
printf(" Bin\n");
|
printf(" Bin\n");
|
||||||
goto free_diffstat_file;
|
goto free_diffstat_file;
|
||||||
}
|
}
|
||||||
else if (data->files[i]->is_unmerged) {
|
else if (data->files[i]->is_unmerged) {
|
||||||
show_name(prefix, name, len);
|
show_name(prefix, name, len, reset, set);
|
||||||
printf(" Unmerged\n");
|
printf(" Unmerged\n");
|
||||||
goto free_diffstat_file;
|
goto free_diffstat_file;
|
||||||
}
|
}
|
||||||
@ -679,18 +688,18 @@ static void show_stats(struct diffstat_t* data, struct diff_options *options)
|
|||||||
add = scale_linear(add, width, max_change);
|
add = scale_linear(add, width, max_change);
|
||||||
del = total - add;
|
del = total - add;
|
||||||
}
|
}
|
||||||
show_name(prefix, name, len);
|
show_name(prefix, name, len, reset, set);
|
||||||
printf("%5d ", added + deleted);
|
printf("%5d ", added + deleted);
|
||||||
show_graph('+', add);
|
show_graph('+', add, add_c, reset);
|
||||||
show_graph('-', del);
|
show_graph('-', del, del_c, reset);
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
free_diffstat_file:
|
free_diffstat_file:
|
||||||
free(data->files[i]->name);
|
free(data->files[i]->name);
|
||||||
free(data->files[i]);
|
free(data->files[i]);
|
||||||
}
|
}
|
||||||
free(data->files);
|
free(data->files);
|
||||||
printf(" %d files changed, %d insertions(+), %d deletions(-)\n",
|
printf("%s %d files changed, %d insertions(+), %d deletions(-)%s\n",
|
||||||
total_files, adds, dels);
|
set, total_files, adds, dels, reset);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct checkdiff_t {
|
struct checkdiff_t {
|
||||||
|
Loading…
Reference in New Issue
Block a user