diff options
author | Junio C Hamano <junkio@cox.net> | 2007-03-10 23:26:33 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-03-10 23:26:33 -0800 |
commit | cf6981d4932007555689052cbc255b911674b01c (patch) | |
tree | 780cfe523171d98ecded8e4d8509db507707e1f3 /diff.c | |
parent | 8509fed75d576023f5f2db8542fad102fcc62d4d (diff) | |
parent | 5bd74506cd30e897d1493639b7438c6cc80dea8e (diff) | |
download | git-cf6981d4932007555689052cbc255b911674b01c.tar.gz |
Merge branch 'js/diff-ni'
* js/diff-ni:
Get rid of the dependency to GNU diff in the tests
diff --no-index: support /dev/null as filename
diff-ni: fix the diff with standard input
diff: support reading a file from stdin via "-"
Diffstat (limited to 'diff.c')
-rw-r--r-- | diff.c | 33 |
1 files changed, 33 insertions, 0 deletions
@@ -1364,6 +1364,32 @@ static struct sha1_size_cache *locate_size_cache(unsigned char *sha1, return e; } +static int populate_from_stdin(struct diff_filespec *s) +{ +#define INCREMENT 1024 + char *buf; + unsigned long size; + int got; + + size = 0; + buf = NULL; + while (1) { + buf = xrealloc(buf, size + INCREMENT); + got = xread(0, buf + size, INCREMENT); + if (!got) + break; /* EOF */ + if (got < 0) + return error("error while reading from stdin %s", + strerror(errno)); + size += got; + } + s->should_munmap = 0; + s->data = buf; + s->size = size; + s->should_free = 1; + return 0; +} + /* * While doing rename detection and pickaxe operation, we may need to * grab the data for the blob (or file) for our own in-core comparison. @@ -1389,6 +1415,9 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only) char *buf; unsigned long size; + if (!strcmp(s->path, "-")) + return populate_from_stdin(s); + if (lstat(s->path, &st) < 0) { if (errno == ENOENT) { err_empty: @@ -1690,6 +1719,10 @@ static void diff_fill_sha1_info(struct diff_filespec *one) if (DIFF_FILE_VALID(one)) { if (!one->sha1_valid) { struct stat st; + if (!strcmp(one->path, "-")) { + hashcpy(one->sha1, null_sha1); + return; + } if (lstat(one->path, &st) < 0) die("stat %s", one->path); if (index_path(one->sha1, one->path, &st, 0)) |