diff options
Diffstat (limited to 'show-diff.c')
-rw-r--r-- | show-diff.c | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/show-diff.c b/show-diff.c index 55b8576805..9f82c05602 100644 --- a/show-diff.c +++ b/show-diff.c @@ -5,18 +5,56 @@ */ #include "cache.h" -static void show_differences(struct cache_entry *ce, struct stat *cur, +static void show_differences(char *name, void *old_contents, unsigned long long old_size) { static char cmd[1000]; FILE *f; - snprintf(cmd, sizeof(cmd), "diff -u - %s", ce->name); + snprintf(cmd, sizeof(cmd), "diff -L %s -u -N - %s", name, name); f = popen(cmd, "w"); - fwrite(old_contents, old_size, 1, f); + if (old_size) + fwrite(old_contents, old_size, 1, f); pclose(f); } +static void show_diff_empty(struct cache_entry *ce) +{ + char *old; + unsigned long int size; + int lines=0; + unsigned char type[20], *p, *end; + + old = read_sha1_file(ce->sha1, type, &size); + if (size > 0) { + int startline = 1; + int c = 0; + + printf("--- %s\n", ce->name); + printf("+++ %s\n", ce->name); + p = old; + end = old + size; + while (p < end) + if (*p++ == '\n') + lines ++; + printf("@@ -1,%d +0,0 @@\n", lines); + p = old; + while (p < end) { + c = *p++; + if (startline) { + putchar('-'); + startline = 0; + } + putchar(c); + if (c == '\n') + startline = 1; + } + if (c!='\n') + printf("\n"); + fflush(stdout); + } +} + int main(int argc, char **argv) { int entries = read_cache(); @@ -36,6 +74,8 @@ int main(int argc, char **argv) if (stat(ce->name, &st) < 0) { printf("%s: %s\n", ce->name, strerror(errno)); + if (errno == ENOENT) + show_diff_empty(ce); continue; } changed = cache_match_stat(ce, &st); @@ -45,8 +85,9 @@ int main(int argc, char **argv) for (n = 0; n < 20; n++) printf("%02x", ce->sha1[n]); printf("\n"); + fflush(stdout); new = read_sha1_file(ce->sha1, type, &size); - show_differences(ce, &st, new, size); + show_differences(ce->name, new, size); free(new); } return 0; |