X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=show-diff.c;h=21c90453eb1320d4b5f6dd89d03b378e3ba54758;hb=42d545e8ff33f478a4b7b99562ab073d8820b334;hp=b8522886a15db861508fb6d03d4d88d6de912a4b;hpb=e83c5163316f89bfbde7d9ab23ca2e25604af290;p=git.git diff --git a/show-diff.c b/show-diff.c index b8522886..21c90453 100644 --- a/show-diff.c +++ b/show-diff.c @@ -1,52 +1,74 @@ +/* + * GIT - The information manager from hell + * + * Copyright (C) Linus Torvalds, 2005 + */ #include "cache.h" -#define MTIME_CHANGED 0x0001 -#define CTIME_CHANGED 0x0002 -#define OWNER_CHANGED 0x0004 -#define MODE_CHANGED 0x0008 -#define INODE_CHANGED 0x0010 -#define DATA_CHANGED 0x0020 - -static int match_stat(struct cache_entry *ce, struct stat *st) -{ - unsigned int changed = 0; - - if (ce->mtime.sec != (unsigned int)st->st_mtim.tv_sec || - ce->mtime.nsec != (unsigned int)st->st_mtim.tv_nsec) - changed |= MTIME_CHANGED; - if (ce->ctime.sec != (unsigned int)st->st_ctim.tv_sec || - ce->ctime.nsec != (unsigned int)st->st_ctim.tv_nsec) - changed |= CTIME_CHANGED; - if (ce->st_uid != (unsigned int)st->st_uid || - ce->st_gid != (unsigned int)st->st_gid) - changed |= OWNER_CHANGED; - if (ce->st_mode != (unsigned int)st->st_mode) - changed |= MODE_CHANGED; - if (ce->st_dev != (unsigned int)st->st_dev || - ce->st_ino != (unsigned int)st->st_ino) - changed |= INODE_CHANGED; - if (ce->st_size != (unsigned int)st->st_size) - changed |= DATA_CHANGED; - return changed; -} - -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("+++ /dev/null\n"); + 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 silent = 0; int entries = read_cache(); int i; + while (argc-- > 1) { + if (!strcmp(argv[1], "-s")) { + silent = 1; + continue; + } + usage("show-diff [-s]"); + } + if (entries < 0) { perror("read_cache"); exit(1); @@ -55,26 +77,29 @@ int main(int argc, char **argv) struct stat st; struct cache_entry *ce = active_cache[i]; int n, changed; - unsigned int mode; unsigned long size; char type[20]; void *new; if (stat(ce->name, &st) < 0) { printf("%s: %s\n", ce->name, strerror(errno)); + if (errno == ENOENT && !silent) + show_diff_empty(ce); continue; } - changed = match_stat(ce, &st); - if (!changed) { - printf("%s: ok\n", ce->name); + changed = cache_match_stat(ce, &st); + if (!changed) continue; - } printf("%.*s: ", ce->namelen, ce->name); for (n = 0; n < 20; n++) printf("%02x", ce->sha1[n]); printf("\n"); + fflush(stdout); + if (silent) + continue; + new = read_sha1_file(ce->sha1, type, &size); - show_differences(ce, &st, new, size); + show_differences(ce->name, new, size); free(new); } return 0;