summaryrefslogtreecommitdiff
path: root/show-diff.c
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 /show-diff.c
parent5e76011c0dd9e3f7f6eb766e8c28dd8fcd4adcf9 (diff)
downloadgit-c0fb976aa779c508314305f309f240fa6bfc3128.tar.gz
[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 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;