| /* |
| * GIT - The information manager from hell |
| * |
| * Copyright (C) Linus Torvalds, 2005 |
| */ |
| #include "cache.h" |
| |
| static void show_differences(struct cache_entry *ce, struct stat *cur, |
| void *old_contents, unsigned long long old_size) |
| { |
| static char cmd[1000]; |
| FILE *f; |
| |
| snprintf(cmd, sizeof(cmd), "diff -u - %s", ce->name); |
| f = popen(cmd, "w"); |
| fwrite(old_contents, old_size, 1, f); |
| pclose(f); |
| } |
| |
| int main(int argc, char **argv) |
| { |
| int entries = read_cache(); |
| int i; |
| |
| if (entries < 0) { |
| perror("read_cache"); |
| exit(1); |
| } |
| for (i = 0; i < entries; i++) { |
| struct stat st; |
| struct cache_entry *ce = active_cache[i]; |
| int n, changed; |
| unsigned long size; |
| char type[20]; |
| void *new; |
| |
| if (stat(ce->name, &st) < 0) { |
| printf("%s: %s\n", ce->name, strerror(errno)); |
| continue; |
| } |
| changed = cache_match_stat(ce, &st); |
| if (!changed) { |
| printf("%s: ok\n", ce->name); |
| continue; |
| } |
| printf("%.*s: ", ce->namelen, ce->name); |
| for (n = 0; n < 20; n++) |
| printf("%02x", ce->sha1[n]); |
| printf("\n"); |
| new = read_sha1_file(ce->sha1, type, &size); |
| show_differences(ce, &st, new, size); |
| free(new); |
| } |
| return 0; |
| } |