aboutsummaryrefslogtreecommitdiff
path: root/diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2007-03-10 23:26:33 -0800
committerJunio C Hamano <junkio@cox.net>2007-03-10 23:26:33 -0800
commitcf6981d4932007555689052cbc255b911674b01c (patch)
tree780cfe523171d98ecded8e4d8509db507707e1f3 /diff.c
parent8509fed75d576023f5f2db8542fad102fcc62d4d (diff)
parent5bd74506cd30e897d1493639b7438c6cc80dea8e (diff)
downloadgit-cf6981d4932007555689052cbc255b911674b01c.tar.gz
git-cf6981d4932007555689052cbc255b911674b01c.tar.xz
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.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/diff.c b/diff.c
index 8f7a7d110..954ca83e0 100644
--- a/diff.c
+++ b/diff.c
@@ -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))