git-diff/git-apply: make diff output a bit friendlier to GNU patch (part 2)
Somebody was wondering on #git channel why a git generated diff does not apply with GNU patch when the filename contains a SP. It is because GNU patch expects to find TAB (and trailing timestamp) on ---/+++ (old_name and new_name) lines after the filenames. The "diff --git" output format was carefully designed to be compatible with GNU patch where it can, but whitespace characters were always a pain. This adds an extra TAB (but not trailing timestamp) to old_name and new_name lines of git-diff output when the filename has a SP in it. An earlier patch updated git-apply to prepare for this. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
5942706357
commit
1a9eb3b9d5
20
diff.c
20
diff.c
@ -204,11 +204,18 @@ static void emit_rewrite_diff(const char *name_a,
|
|||||||
struct diff_filespec *two)
|
struct diff_filespec *two)
|
||||||
{
|
{
|
||||||
int lc_a, lc_b;
|
int lc_a, lc_b;
|
||||||
|
const char *name_a_tab, *name_b_tab;
|
||||||
|
|
||||||
|
name_a_tab = strchr(name_a, ' ') ? "\t" : "";
|
||||||
|
name_b_tab = strchr(name_b, ' ') ? "\t" : "";
|
||||||
|
|
||||||
diff_populate_filespec(one, 0);
|
diff_populate_filespec(one, 0);
|
||||||
diff_populate_filespec(two, 0);
|
diff_populate_filespec(two, 0);
|
||||||
lc_a = count_lines(one->data, one->size);
|
lc_a = count_lines(one->data, one->size);
|
||||||
lc_b = count_lines(two->data, two->size);
|
lc_b = count_lines(two->data, two->size);
|
||||||
printf("--- a/%s\n+++ b/%s\n@@ -", name_a, name_b);
|
printf("--- a/%s%s\n+++ b/%s%s\n@@ -",
|
||||||
|
name_a, name_a_tab,
|
||||||
|
name_b, name_b_tab);
|
||||||
print_line_count(lc_a);
|
print_line_count(lc_a);
|
||||||
printf(" +");
|
printf(" +");
|
||||||
print_line_count(lc_b);
|
print_line_count(lc_b);
|
||||||
@ -474,8 +481,15 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
|
|||||||
const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);
|
const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);
|
||||||
|
|
||||||
if (ecbdata->label_path[0]) {
|
if (ecbdata->label_path[0]) {
|
||||||
printf("%s--- %s%s\n", set, ecbdata->label_path[0], reset);
|
const char *name_a_tab, *name_b_tab;
|
||||||
printf("%s+++ %s%s\n", set, ecbdata->label_path[1], reset);
|
|
||||||
|
name_a_tab = strchr(ecbdata->label_path[0], ' ') ? "\t" : "";
|
||||||
|
name_b_tab = strchr(ecbdata->label_path[1], ' ') ? "\t" : "";
|
||||||
|
|
||||||
|
printf("%s--- %s%s%s\n",
|
||||||
|
set, ecbdata->label_path[0], reset, name_a_tab);
|
||||||
|
printf("%s+++ %s%s%s\n",
|
||||||
|
set, ecbdata->label_path[1], reset, name_b_tab);
|
||||||
ecbdata->label_path[0] = ecbdata->label_path[1] = NULL;
|
ecbdata->label_path[0] = ecbdata->label_path[1] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user