]>
Commit | Line | Data |
---|---|---|
8bc9a0c7 LT |
1 | /* |
2 | * GIT - The information manager from hell | |
3 | * | |
4 | * Copyright (C) Linus Torvalds, 2005 | |
5 | */ | |
e83c5163 LT |
6 | #include "cache.h" |
7 | ||
aebb2679 | 8 | static void show_differences(char *name, |
e83c5163 LT |
9 | void *old_contents, unsigned long long old_size) |
10 | { | |
11 | static char cmd[1000]; | |
12 | FILE *f; | |
13 | ||
c0fb976a | 14 | snprintf(cmd, sizeof(cmd), "diff -L %s -u -N - %s", name, name); |
e83c5163 | 15 | f = popen(cmd, "w"); |
c0fb976a CL |
16 | if (old_size) |
17 | fwrite(old_contents, old_size, 1, f); | |
e83c5163 LT |
18 | pclose(f); |
19 | } | |
20 | ||
c0fb976a CL |
21 | static void show_diff_empty(struct cache_entry *ce) |
22 | { | |
23 | char *old; | |
24 | unsigned long int size; | |
25 | int lines=0; | |
26 | unsigned char type[20], *p, *end; | |
27 | ||
28 | old = read_sha1_file(ce->sha1, type, &size); | |
29 | if (size > 0) { | |
30 | int startline = 1; | |
31 | int c = 0; | |
32 | ||
33 | printf("--- %s\n", ce->name); | |
c57a3a91 | 34 | printf("+++ /dev/null\n"); |
c0fb976a | 35 | p = old; |
aebb2679 | 36 | end = old + size; |
c0fb976a CL |
37 | while (p < end) |
38 | if (*p++ == '\n') | |
39 | lines ++; | |
40 | printf("@@ -1,%d +0,0 @@\n", lines); | |
41 | p = old; | |
42 | while (p < end) { | |
43 | c = *p++; | |
44 | if (startline) { | |
45 | putchar('-'); | |
46 | startline = 0; | |
aebb2679 | 47 | } |
c0fb976a CL |
48 | putchar(c); |
49 | if (c == '\n') | |
50 | startline = 1; | |
51 | } | |
52 | if (c!='\n') | |
53 | printf("\n"); | |
54 | fflush(stdout); | |
55 | } | |
56 | } | |
57 | ||
e83c5163 LT |
58 | int main(int argc, char **argv) |
59 | { | |
e2e5e98a | 60 | int silent = 0; |
e83c5163 LT |
61 | int entries = read_cache(); |
62 | int i; | |
63 | ||
e2e5e98a PB |
64 | while (argc-- > 1) { |
65 | if (!strcmp(argv[1], "-s")) { | |
66 | silent = 1; | |
67 | continue; | |
68 | } | |
69 | usage("show-diff [-s]"); | |
70 | } | |
71 | ||
e83c5163 LT |
72 | if (entries < 0) { |
73 | perror("read_cache"); | |
74 | exit(1); | |
75 | } | |
76 | for (i = 0; i < entries; i++) { | |
77 | struct stat st; | |
78 | struct cache_entry *ce = active_cache[i]; | |
79 | int n, changed; | |
e83c5163 LT |
80 | unsigned long size; |
81 | char type[20]; | |
82 | void *new; | |
83 | ||
84 | if (stat(ce->name, &st) < 0) { | |
85 | printf("%s: %s\n", ce->name, strerror(errno)); | |
e2e5e98a | 86 | if (errno == ENOENT && !silent) |
c0fb976a | 87 | show_diff_empty(ce); |
e83c5163 LT |
88 | continue; |
89 | } | |
734aab75 | 90 | changed = cache_match_stat(ce, &st); |
5e76011c | 91 | if (!changed) |
e83c5163 | 92 | continue; |
ccc4feb5 | 93 | printf("%.*s: ", ce_namelen(ce), ce->name); |
e83c5163 LT |
94 | for (n = 0; n < 20; n++) |
95 | printf("%02x", ce->sha1[n]); | |
96 | printf("\n"); | |
c0fb976a | 97 | fflush(stdout); |
e2e5e98a PB |
98 | if (silent) |
99 | continue; | |
100 | ||
e83c5163 | 101 | new = read_sha1_file(ce->sha1, type, &size); |
c0fb976a | 102 | show_differences(ce->name, new, size); |
e83c5163 LT |
103 | free(new); |
104 | } | |
105 | return 0; | |
106 | } |