Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2005 Junio C Hamano |
| 3 | */ |
| 4 | |
| 5 | #include "cache.h" |
| 6 | #include "diff.h" |
| 7 | |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 8 | static struct diff_options diff_options; |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 9 | |
Petr Baudis | 4d1f119 | 2005-07-29 11:01:26 +0200 | [diff] [blame] | 10 | static const char diff_stages_usage[] = |
Junio C Hamano | dda2d79 | 2005-07-13 12:52:35 -0700 | [diff] [blame] | 11 | "git-diff-stages [<common diff options>] <stage1> <stage2> [<path>...]" |
| 12 | COMMON_DIFF_OPTIONS_HELP; |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 13 | |
Junio C Hamano | 9939664 | 2005-06-10 18:44:36 -0700 | [diff] [blame] | 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) |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 40 | diff_addremove(&diff_options, '+', ntohl(two->ce_mode), |
Junio C Hamano | 9939664 | 2005-06-10 18:44:36 -0700 | [diff] [blame] | 41 | two->sha1, name, NULL); |
| 42 | else if (!two) |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 43 | diff_addremove(&diff_options, '-', ntohl(one->ce_mode), |
Junio C Hamano | 9939664 | 2005-06-10 18:44:36 -0700 | [diff] [blame] | 44 | one->sha1, name, NULL); |
| 45 | else if (memcmp(one->sha1, two->sha1, 20) || |
Junio C Hamano | 4727f64 | 2005-06-19 13:14:05 -0700 | [diff] [blame] | 46 | (one->ce_mode != two->ce_mode) || |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 47 | diff_options.find_copies_harder) |
| 48 | diff_change(&diff_options, |
| 49 | ntohl(one->ce_mode), ntohl(two->ce_mode), |
Junio C Hamano | 4727f64 | 2005-06-19 13:14:05 -0700 | [diff] [blame] | 50 | one->sha1, two->sha1, name, NULL); |
Junio C Hamano | 9939664 | 2005-06-10 18:44:36 -0700 | [diff] [blame] | 51 | } |
| 52 | } |
| 53 | |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 54 | int main(int ac, const char **av) |
| 55 | { |
Junio C Hamano | 9939664 | 2005-06-10 18:44:36 -0700 | [diff] [blame] | 56 | int stage1, stage2; |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 57 | |
Junio C Hamano | 9ce392f | 2005-11-21 22:52:37 -0800 | [diff] [blame] | 58 | setup_git_directory(); |
| 59 | |
| 60 | git_config(git_diff_config); |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 61 | read_cache(); |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 62 | diff_setup(&diff_options); |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 63 | while (1 < ac && av[1][0] == '-') { |
| 64 | const char *arg = av[1]; |
| 65 | if (!strcmp(arg, "-r")) |
| 66 | ; /* as usual */ |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 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) |
| 72 | usage(diff_stages_usage); |
| 73 | else if (diff_opt_cnt) { |
| 74 | av += diff_opt_cnt; |
| 75 | ac -= diff_opt_cnt; |
| 76 | continue; |
| 77 | } |
| 78 | else |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 79 | usage(diff_stages_usage); |
| 80 | } |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 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 || |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 88 | ! (0 <= stage2 && stage2 <= 3)) |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 89 | usage(diff_stages_usage); |
| 90 | |
| 91 | av += 3; /* The rest from av[0] are for paths restriction. */ |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 92 | diff_options.paths = av; |
| 93 | |
| 94 | if (diff_setup_done(&diff_options) < 0) |
| 95 | usage(diff_stages_usage); |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 96 | |
Junio C Hamano | 9939664 | 2005-06-10 18:44:36 -0700 | [diff] [blame] | 97 | diff_stages(stage1, stage2); |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 98 | diffcore_std(&diff_options); |
| 99 | diff_flush(&diff_options); |
Junio C Hamano | 22f77b7 | 2005-06-09 15:13:13 -0700 | [diff] [blame] | 100 | return 0; |
| 101 | } |