Junio C Hamano | be3cfa8 | 2005-04-26 09:25:05 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2005 Junio C Hamano |
| 3 | */ |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 4 | #include "cache.h" |
| 5 | #include "strbuf.h" |
| 6 | #include "diff.h" |
| 7 | |
Junio C Hamano | 057c7d3 | 2005-05-21 15:02:51 -0700 | [diff] [blame] | 8 | static const char *pickaxe = NULL; |
Junio C Hamano | 367cec1 | 2005-05-27 15:55:28 -0700 | [diff] [blame] | 9 | static int pickaxe_opts = 0; |
Junio C Hamano | ce24067 | 2005-06-03 01:36:43 -0700 | [diff] [blame] | 10 | static const char *orderfile = NULL; |
Junio C Hamano | 81e50ea | 2005-05-21 19:42:18 -0700 | [diff] [blame] | 11 | static int line_termination = '\n'; |
| 12 | static int inter_name_termination = '\t'; |
Junio C Hamano | 915838c | 2005-05-17 23:29:49 -0700 | [diff] [blame] | 13 | |
Junio C Hamano | ce24067 | 2005-06-03 01:36:43 -0700 | [diff] [blame] | 14 | static void flush_them(int ac, const char **av) |
| 15 | { |
| 16 | diffcore_std(av + 1, |
| 17 | 0, 0, /* no renames */ |
| 18 | pickaxe, pickaxe_opts, |
| 19 | -1, /* no breaks */ |
| 20 | orderfile); |
| 21 | diff_flush(DIFF_FORMAT_PATCH, 0); |
| 22 | } |
| 23 | |
Junio C Hamano | 902b92e | 2005-05-13 18:41:36 -0700 | [diff] [blame] | 24 | static const char *diff_helper_usage = |
Junio C Hamano | ce24067 | 2005-06-03 01:36:43 -0700 | [diff] [blame] | 25 | "git-diff-helper [-z] [-S<string>] [-O<orderfile>] paths..."; |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 26 | |
Junio C Hamano | 91a6eaa | 2005-04-28 10:13:01 -0700 | [diff] [blame] | 27 | int main(int ac, const char **av) { |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 28 | struct strbuf sb; |
Junio C Hamano | 2bc2564 | 2005-05-27 21:05:38 -0700 | [diff] [blame] | 29 | const char *garbage_flush_format; |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 30 | |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 31 | strbuf_init(&sb); |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 32 | |
| 33 | while (1 < ac && av[1][0] == '-') { |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 34 | if (av[1][1] == 'z') |
Junio C Hamano | 81e50ea | 2005-05-21 19:42:18 -0700 | [diff] [blame] | 35 | line_termination = inter_name_termination = 0; |
Junio C Hamano | 52e9578 | 2005-05-21 02:40:01 -0700 | [diff] [blame] | 36 | else if (av[1][1] == 'S') { |
| 37 | pickaxe = av[1] + 2; |
| 38 | } |
Junio C Hamano | 367cec1 | 2005-05-27 15:55:28 -0700 | [diff] [blame] | 39 | else if (!strcmp(av[1], "--pickaxe-all")) |
| 40 | pickaxe_opts = DIFF_PICKAXE_ALL; |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 41 | else |
Junio C Hamano | 902b92e | 2005-05-13 18:41:36 -0700 | [diff] [blame] | 42 | usage(diff_helper_usage); |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 43 | ac--; av++; |
| 44 | } |
Junio C Hamano | 2bc2564 | 2005-05-27 21:05:38 -0700 | [diff] [blame] | 45 | garbage_flush_format = (line_termination == 0) ? "%s" : "%s\n"; |
| 46 | |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 47 | /* the remaining parameters are paths patterns */ |
| 48 | |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 49 | diff_setup(0); |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 50 | while (1) { |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 51 | unsigned old_mode, new_mode; |
| 52 | unsigned char old_sha1[20], new_sha1[20]; |
| 53 | char old_path[PATH_MAX]; |
| 54 | int status, score, two_paths; |
| 55 | char new_path[PATH_MAX]; |
| 56 | |
| 57 | int ch; |
| 58 | char *cp, *ep; |
| 59 | |
| 60 | read_line(&sb, stdin, line_termination); |
| 61 | if (sb.eof) |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 62 | break; |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 63 | switch (sb.buf[0]) { |
Junio C Hamano | 81e50ea | 2005-05-21 19:42:18 -0700 | [diff] [blame] | 64 | case ':': |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 65 | /* parse the first part up to the status */ |
| 66 | cp = sb.buf + 1; |
| 67 | old_mode = new_mode = 0; |
| 68 | while ((ch = *cp) && ('0' <= ch && ch <= '7')) { |
| 69 | old_mode = (old_mode << 3) | (ch - '0'); |
| 70 | cp++; |
| 71 | } |
| 72 | if (*cp++ != ' ') |
Junio C Hamano | 81e50ea | 2005-05-21 19:42:18 -0700 | [diff] [blame] | 73 | break; |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 74 | while ((ch = *cp) && ('0' <= ch && ch <= '7')) { |
| 75 | new_mode = (new_mode << 3) | (ch - '0'); |
| 76 | cp++; |
| 77 | } |
| 78 | if (*cp++ != ' ') |
Junio C Hamano | 81e50ea | 2005-05-21 19:42:18 -0700 | [diff] [blame] | 79 | break; |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 80 | if (get_sha1_hex(cp, old_sha1)) |
| 81 | break; |
| 82 | cp += 40; |
| 83 | if (*cp++ != ' ') |
| 84 | break; |
| 85 | if (get_sha1_hex(cp, new_sha1)) |
| 86 | break; |
| 87 | cp += 40; |
| 88 | if (*cp++ != ' ') |
| 89 | break; |
| 90 | status = *cp++; |
| 91 | if (!strchr("MCRNDU", status)) |
| 92 | break; |
| 93 | two_paths = score = 0; |
Junio C Hamano | ddafa7e | 2005-05-29 16:54:59 -0700 | [diff] [blame] | 94 | if (status == 'R' || status == 'C') |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 95 | two_paths = 1; |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 96 | |
Junio C Hamano | ddafa7e | 2005-05-29 16:54:59 -0700 | [diff] [blame] | 97 | /* pick up score if exists */ |
| 98 | if (sscanf(cp, "%d", &score) != 1) |
| 99 | score = 0; |
| 100 | cp = strchr(cp, |
| 101 | inter_name_termination); |
| 102 | if (!cp) |
| 103 | break; |
Junio C Hamano | b6d8f30 | 2005-05-23 14:55:33 -0700 | [diff] [blame] | 104 | if (*cp++ != inter_name_termination) |
| 105 | break; |
| 106 | |
| 107 | /* first pathname */ |
| 108 | if (!line_termination) { |
| 109 | read_line(&sb, stdin, line_termination); |
| 110 | if (sb.eof) |
| 111 | break; |
| 112 | strcpy(old_path, sb.buf); |
| 113 | } |
| 114 | else if (!two_paths) |
| 115 | strcpy(old_path, cp); |
| 116 | else { |
| 117 | ep = strchr(cp, inter_name_termination); |
| 118 | if (!ep) |
| 119 | break; |
| 120 | strncpy(old_path, cp, ep-cp); |
| 121 | old_path[ep-cp] = 0; |
| 122 | cp = ep + 1; |
| 123 | } |
| 124 | |
| 125 | /* second pathname */ |
| 126 | if (!two_paths) |
| 127 | strcpy(new_path, old_path); |
| 128 | else { |
| 129 | if (!line_termination) { |
| 130 | read_line(&sb, stdin, |
| 131 | line_termination); |
| 132 | if (sb.eof) |
| 133 | break; |
| 134 | strcpy(new_path, sb.buf); |
| 135 | } |
| 136 | else |
| 137 | strcpy(new_path, cp); |
| 138 | } |
| 139 | diff_helper_input(old_mode, new_mode, |
| 140 | old_sha1, new_sha1, |
| 141 | old_path, status, score, |
| 142 | new_path); |
| 143 | continue; |
Junio C Hamano | 81e50ea | 2005-05-21 19:42:18 -0700 | [diff] [blame] | 144 | } |
Junio C Hamano | ce24067 | 2005-06-03 01:36:43 -0700 | [diff] [blame] | 145 | flush_them(ac, av); |
Junio C Hamano | 2bc2564 | 2005-05-27 21:05:38 -0700 | [diff] [blame] | 146 | printf(garbage_flush_format, sb.buf); |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 147 | } |
Junio C Hamano | ce24067 | 2005-06-03 01:36:43 -0700 | [diff] [blame] | 148 | flush_them(ac, av); |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 149 | return 0; |
| 150 | } |