From c0fb976aa779c508314305f309f240fa6bfc3128 Mon Sep 17 00:00:00 2001 From: Christopher Li Date: Tue, 12 Apr 2005 02:04:44 -0700 Subject: [PATCH] [PATCH] show-diff show deleted files as diff as well. The ideas is that using the show-diff to generate the patch including deleted and new file (in the next patch). So we don't have to do the temp new file diff dance on the script. The cache index now contain enough information to generate the whole patch. So the GIT SCM don't need separate command for check out file to edit or delete. Just do the edit and remove and GIT will generate the correct patch. It still require tell GIT to add new files. --- show-diff.c | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/show-diff.c b/show-diff.c index 55b857680..9f82c0560 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; -- 2.45.2