To distinguish the general bulk-move case (where the destination directory was pre-existing) from the directory-rename case (where it was not), the output of raw diff is displayed as "Rnnn a/* b/". Those cannot be confused with renames of files named "whatever/*" with a literal star character, from the full-zero SHA1's. Signed-off-by: Yann Dirson <ydirson@xxxxxxx> --- Documentation/gitdiffcore.txt | 2 +- diff.c | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Documentation/gitdiffcore.txt b/Documentation/gitdiffcore.txt index 93111ac..2538dc0 100644 --- a/Documentation/gitdiffcore.txt +++ b/Documentation/gitdiffcore.txt @@ -181,7 +181,7 @@ additional pass on top of the results of per-file rename detection. They are reported with NULL SHA1 id, in addition to the file renames: ------------------------------------------------ -:040000 040000 0000000... 0000000... R100 foo/ bar/ +:040000 040000 0000000... 0000000... R100 foo/* bar/ :100644 100644 0123456... 1234567... R090 foo/file0 bar/file3 :100644 100644 2345678... 2345678... R100 foo/file1 bar/file1 :100644 100644 3456789... 3456789... R100 foo/file2 bar/file2 diff --git a/diff.c b/diff.c index d64ae44..0694d7f 100644 --- a/diff.c +++ b/diff.c @@ -3499,7 +3499,14 @@ static void diff_flush_raw(struct diff_filepair *p, struct diff_options *opt) if (p->status == DIFF_STATUS_COPIED || p->status == DIFF_STATUS_RENAMED) { const char *name_a, *name_b; - name_a = p->one->path; + if (p->is_bulkmove) { + /* append "*" to the first dirname */ + char buf[PATH_MAX]; + char *next = memccpy(buf, p->one->path, '\0', PATH_MAX); + next[-1] = '*'; *next = '\0'; + name_a = buf; + } else + name_a = p->one->path; name_b = p->two->path; strip_prefix(opt->prefix_length, &name_a, &name_b); write_name_quoted(name_a, opt->file, inter_name_termination); -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html