[PATCH] show-diff show deleted files as diff as well.
authorChristopher Li <git@chrisli.org>
Tue, 12 Apr 2005 09:04:44 +0000 (02:04 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Tue, 12 Apr 2005 09:04:44 +0000 (02:04 -0700)
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

index 55b85768058ff36db3355979b55576741ec900fb..9f82c05602b6a94218d50b62a2481cf8a4ece749 100644 (file)
@@ -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;