X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=sidebyside;f=show-diff.c;h=fdd7dd4b0cc8c92a18ddaf0bcf8c9675fcab303b;hb=3a663fd9842aaa9e232ab43a811d11f1d7f0b7bc;hp=4221d3ae4c7a844627cd72c3f4772bbe94abda16;hpb=d94c6128e6df3161b111e7af73a7ef782eb4b63e;p=git.git diff --git a/show-diff.c b/show-diff.c index 4221d3ae..fdd7dd4b 100644 --- a/show-diff.c +++ b/show-diff.c @@ -4,58 +4,14 @@ * Copyright (C) Linus Torvalds, 2005 */ #include "cache.h" +#include "diff.h" -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 -L %s -u -N - %s", name, name); - f = popen(cmd, "w"); - 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; +static const char *show_diff_usage = +"show-diff [-p] [-q] [-r] [-z] [paths...]"; - 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); - } -} - -static const char *show_diff_usage = "show-diff [-s] [-q] [-z] [paths...]"; +static int generate_patch = 0; +static int line_termination = '\n'; +static int silent = 0; static int matches_pathspec(struct cache_entry *ce, char **spec, int cnt) { @@ -72,22 +28,57 @@ static int matches_pathspec(struct cache_entry *ce, char **spec, int cnt) return 0; } +static void show_unmerge(const char *path) +{ + if (generate_patch) + diff_unmerge(path); + else + printf("U %s%c", path, line_termination); +} + +static void show_file(int pfx, struct cache_entry *ce) +{ + if (generate_patch) + diff_addremove(pfx, ntohl(ce->ce_mode), ce->sha1, + ce->name, NULL); + else + printf("%c%06o\t%s\t%s\t%s%c", + pfx, ntohl(ce->ce_mode), "blob", + sha1_to_hex(ce->sha1), ce->name, line_termination); +} + +static void show_modified(int oldmode, int mode, + const char *old_sha1, const char *sha1, + char *path) +{ + char old_sha1_hex[41]; + strcpy(old_sha1_hex, sha1_to_hex(old_sha1)); + + if (generate_patch) + diff_change(oldmode, mode, old_sha1, sha1, path, NULL); + else + printf("*%06o->%06o\tblob\t%s->%s\t%s%c", + oldmode, mode, old_sha1_hex, sha1_to_hex(sha1), path, + line_termination); +} + int main(int argc, char **argv) { - int silent = 0; - int silent_on_nonexisting_files = 0; - int machine_readable = 0; + static const char null_sha1[20] = { 0, }; int entries = read_cache(); int i; while (1 < argc && argv[1][0] == '-') { - if (!strcmp(argv[1], "-s")) - silent_on_nonexisting_files = silent = 1; + if (!strcmp(argv[1], "-p")) + generate_patch = 1; else if (!strcmp(argv[1], "-q")) - silent_on_nonexisting_files = 1; - else if (!strcmp(argv[1], "-z")) { - machine_readable = 1; - } + silent = 1; + else if (!strcmp(argv[1], "-r")) + ; /* no-op */ + else if (!strcmp(argv[1], "-s")) + ; /* no-op */ + else if (!strcmp(argv[1], "-z")) + line_termination = 0; else usage(show_diff_usage); argv++; argc--; @@ -100,46 +91,45 @@ int main(int argc, char **argv) perror("read_cache"); exit(1); } + for (i = 0; i < entries; i++) { struct stat st; + unsigned int oldmode, mode; struct cache_entry *ce = active_cache[i]; int changed; - unsigned long size; - char type[20]; - void *new; - if (1 name); + while (i < entries && + !strcmp(ce->name, active_cache[i]->name)) + i++; + i--; /* compensate for loop control increments */ + continue; + } + if (stat(ce->name, &st) < 0) { - if (errno == ENOENT && silent_on_nonexisting_files) + if (errno != ENOENT) { + perror(ce->name); continue; - if (machine_readable) - printf("X %s%c", ce->name, 0); - else { - printf("%s: %s\n", ce->name, strerror(errno)); - if (errno == ENOENT) - show_diff_empty(ce); - } + } + if (silent) + continue; + show_file('-', ce); continue; } changed = cache_match_stat(ce, &st); if (!changed) continue; - if (!machine_readable) - printf("%s: %s\n", ce->name, sha1_to_hex(ce->sha1)); - else { - printf("%s %s%c", sha1_to_hex(ce->sha1), ce->name, 0); - continue; - } - fflush(stdout); - if (silent) - continue; - new = read_sha1_file(ce->sha1, type, &size); - show_differences(ce->name, new, size); - free(new); + oldmode = ntohl(ce->ce_mode); + mode = S_IFREG | ce_permissions(st.st_mode); + + show_modified(oldmode, mode, ce->sha1, null_sha1, + ce->name); } return 0; }