aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Li <git@chrisli.org>2005-04-12 02:04:44 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-12 02:04:44 -0700
commitc0fb976aa779c508314305f309f240fa6bfc3128 (patch)
tree41fa9643de0044c75ac654ab2dd2319f1bf3b640
parent5e76011c0dd9e3f7f6eb766e8c28dd8fcd4adcf9 (diff)
downloadgit-c0fb976aa779c508314305f309f240fa6bfc3128.tar.gz
git-c0fb976aa779c508314305f309f240fa6bfc3128.tar.xz
[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.
-rw-r--r--show-diff.c49
1 files 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;