]>
Commit | Line | Data |
---|---|---|
22f77b77 JH |
1 | /* |
2 | * Copyright (c) 2005 Junio C Hamano | |
3 | */ | |
4 | ||
5 | #include "cache.h" | |
6 | #include "diff.h" | |
7 | ||
6b5ee137 | 8 | static struct diff_options diff_options; |
22f77b77 | 9 | |
4d1f1190 | 10 | static const char diff_stages_usage[] = |
dda2d79a JH |
11 | "git-diff-stages [<common diff options>] <stage1> <stage2> [<path>...]" |
12 | COMMON_DIFF_OPTIONS_HELP; | |
22f77b77 | 13 | |
9939664a JH |
14 | static void diff_stages(int stage1, int stage2) |
15 | { | |
16 | int i = 0; | |
17 | while (i < active_nr) { | |
18 | struct cache_entry *ce, *stages[4] = { NULL, }; | |
19 | struct cache_entry *one, *two; | |
20 | const char *name; | |
21 | int len; | |
22 | ce = active_cache[i]; | |
23 | len = ce_namelen(ce); | |
24 | name = ce->name; | |
25 | for (;;) { | |
26 | int stage = ce_stage(ce); | |
27 | stages[stage] = ce; | |
28 | if (active_nr <= ++i) | |
29 | break; | |
30 | ce = active_cache[i]; | |
31 | if (ce_namelen(ce) != len || | |
32 | memcmp(name, ce->name, len)) | |
33 | break; | |
34 | } | |
35 | one = stages[stage1]; | |
36 | two = stages[stage2]; | |
37 | if (!one && !two) | |
38 | continue; | |
39 | if (!one) | |
6b5ee137 | 40 | diff_addremove(&diff_options, '+', ntohl(two->ce_mode), |
9939664a JH |
41 | two->sha1, name, NULL); |
42 | else if (!two) | |
6b5ee137 | 43 | diff_addremove(&diff_options, '-', ntohl(one->ce_mode), |
9939664a JH |
44 | one->sha1, name, NULL); |
45 | else if (memcmp(one->sha1, two->sha1, 20) || | |
4727f640 | 46 | (one->ce_mode != two->ce_mode) || |
6b5ee137 JH |
47 | diff_options.find_copies_harder) |
48 | diff_change(&diff_options, | |
49 | ntohl(one->ce_mode), ntohl(two->ce_mode), | |
4727f640 | 50 | one->sha1, two->sha1, name, NULL); |
9939664a JH |
51 | } |
52 | } | |
53 | ||
22f77b77 JH |
54 | int main(int ac, const char **av) |
55 | { | |
9939664a | 56 | int stage1, stage2; |
22f77b77 | 57 | |
9ce392f4 JH |
58 | setup_git_directory(); |
59 | ||
60 | git_config(git_diff_config); | |
22f77b77 | 61 | read_cache(); |
6b5ee137 | 62 | diff_setup(&diff_options); |
22f77b77 JH |
63 | while (1 < ac && av[1][0] == '-') { |
64 | const char *arg = av[1]; | |
65 | if (!strcmp(arg, "-r")) | |
66 | ; /* as usual */ | |
6b5ee137 JH |
67 | else { |
68 | int diff_opt_cnt; | |
69 | diff_opt_cnt = diff_opt_parse(&diff_options, | |
70 | av+1, ac-1); | |
71 | if (diff_opt_cnt < 0) | |
22f77b77 | 72 | usage(diff_stages_usage); |
6b5ee137 JH |
73 | else if (diff_opt_cnt) { |
74 | av += diff_opt_cnt; | |
75 | ac -= diff_opt_cnt; | |
76 | continue; | |
77 | } | |
78 | else | |
22f77b77 JH |
79 | usage(diff_stages_usage); |
80 | } | |
22f77b77 JH |
81 | ac--; av++; |
82 | } | |
83 | ||
84 | if (ac < 3 || | |
85 | sscanf(av[1], "%d", &stage1) != 1 || | |
86 | ! (0 <= stage1 && stage1 <= 3) || | |
87 | sscanf(av[2], "%d", &stage2) != 1 || | |
6b5ee137 | 88 | ! (0 <= stage2 && stage2 <= 3)) |
22f77b77 JH |
89 | usage(diff_stages_usage); |
90 | ||
91 | av += 3; /* The rest from av[0] are for paths restriction. */ | |
6b5ee137 | 92 | diff_options.paths = av; |
22f77b77 | 93 | |
6b5ee137 JH |
94 | if (diff_setup_done(&diff_options) < 0) |
95 | usage(diff_stages_usage); | |
22f77b77 | 96 | |
6b5ee137 JH |
97 | diff_stages(stage1, stage2); |
98 | diffcore_std(&diff_options); | |
99 | diff_flush(&diff_options); | |
22f77b77 JH |
100 | return 0; |
101 | } |