diff <(command1) <(command2) provides useful output, let's make it possible for git to do the same. Signed-off-by: Dennis Kaarsemaker <dennis@xxxxxxxxxxxxxxx> --- diff-no-index.c | 8 ++++++++ diff.c | 13 +++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/diff-no-index.c b/diff-no-index.c index 15811c2..487dbf5 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -83,6 +83,14 @@ static struct diff_filespec *noindex_filespec(const char *name, int mode) name = "/dev/null"; s = alloc_filespec(name); fill_filespec(s, null_sha1, 0, mode); + /* + * In --no-index mode, we support reading from pipes. canon_mode, called by + * fill_filespec, gets confused by this and thinks we now have subprojects. + * Detect this and tell the rest of the diff machinery to treat pipes as + * normal files. + */ + if (S_ISGITLINK(s->mode)) + s->mode = S_IFREG | ce_permissions(mode); if (name == file_from_standard_input) populate_from_stdin(s); return s; diff --git a/diff.c b/diff.c index 1eaf604..c599efb 100644 --- a/diff.c +++ b/diff.c @@ -2839,9 +2839,18 @@ int diff_populate_filespec(struct diff_filespec *s, unsigned int flags) fd = open(s->path, O_RDONLY); if (fd < 0) goto err_empty; - s->data = xmmap(NULL, s->size, PROT_READ, MAP_PRIVATE, fd, 0); + if (!S_ISREG(st.st_mode)) { + struct strbuf sb = STRBUF_INIT; + strbuf_read(&sb, fd, 0); + s->size = sb.len; + s->data = strbuf_detach(&sb, NULL); + s->should_free = 1; + } + else { + s->data = xmmap(NULL, s->size, PROT_READ, MAP_PRIVATE, fd, 0); + s->should_munmap = 1; + } close(fd); - s->should_munmap = 1; /* * Convert from working tree format to canonical git format -- 2.10.1-449-gab0f84c