summaryrefslogtreecommitdiff
path: root/show-diff.c
diff options
context:
space:
mode:
authorChristopher Li <git@chrisli.org>2005-04-12 09:04:44 (GMT)
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-12 09:04:44 (GMT)
commitc0fb976aa779c508314305f309f240fa6bfc3128 (patch)
tree41fa9643de0044c75ac654ab2dd2319f1bf3b640 /show-diff.c
parent5e76011c0dd9e3f7f6eb766e8c28dd8fcd4adcf9 (diff)
downloadgit-c0fb976aa779c508314305f309f240fa6bfc3128.zip
git-c0fb976aa779c508314305f309f240fa6bfc3128.tar.gz
git-c0fb976aa779c508314305f309f240fa6bfc3128.tar.bz2
[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.
Diffstat (limited to 'show-diff.c')
-rw-r--r--show-diff.c49
1 files changed, 45 insertions, 4 deletions
diff --git a/show-diff.c b/show-diff.c
index 55b8576..9f82c05 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;