Linus Torvalds | 9174026 | 2005-04-09 13:00:54 -0700 | [diff] [blame] | 1 | #include "cache.h" |
Junio C Hamano | 3ebfd4a | 2005-04-27 09:21:00 -0700 | [diff] [blame] | 2 | #include "diff.h" |
Linus Torvalds | e3bc7a3 | 2005-06-01 08:34:23 -0700 | [diff] [blame] | 3 | #include "commit.h" |
Linus Torvalds | 9174026 | 2005-04-09 13:00:54 -0700 | [diff] [blame] | 4 | |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 5 | static int show_root_diff = 0; |
Pavel Roskin | 601c978 | 2005-11-10 00:30:12 -0500 | [diff] [blame] | 6 | static int no_commit_id = 0; |
Linus Torvalds | cee99d2 | 2005-05-06 11:42:47 -0700 | [diff] [blame] | 7 | static int verbose_header = 0; |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 8 | static int ignore_merges = 1; |
Junio C Hamano | 6932c78 | 2006-02-11 16:43:30 -0800 | [diff] [blame] | 9 | static int combine_merges = 0; |
Junio C Hamano | d8f4790 | 2006-01-24 01:22:04 -0800 | [diff] [blame] | 10 | static int dense_combined_merges = 0; |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 11 | static int read_stdin = 0; |
Linus Torvalds | ec0bdb6 | 2006-02-05 11:42:09 -0800 | [diff] [blame] | 12 | static int always_show_header = 0; |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 13 | |
Linus Torvalds | f4f21ce | 2005-05-06 10:56:35 -0700 | [diff] [blame] | 14 | static const char *header = NULL; |
Linus Torvalds | cee99d2 | 2005-05-06 11:42:47 -0700 | [diff] [blame] | 15 | static const char *header_prefix = ""; |
Linus Torvalds | 000182e | 2005-06-05 09:02:03 -0700 | [diff] [blame] | 16 | static enum cmit_fmt commit_format = CMIT_FMT_RAW; |
Linus Torvalds | 9174026 | 2005-04-09 13:00:54 -0700 | [diff] [blame] | 17 | |
Linus Torvalds | ac1b3d1 | 2005-10-20 21:05:05 -0700 | [diff] [blame] | 18 | static struct diff_options diff_options; |
Linus Torvalds | 73134b6 | 2005-04-10 14:03:58 -0700 | [diff] [blame] | 19 | |
Linus Torvalds | 09d74b3 | 2005-05-22 14:33:43 -0700 | [diff] [blame] | 20 | static int call_diff_flush(void) |
Junio C Hamano | 38c6f78 | 2005-05-21 19:40:36 -0700 | [diff] [blame] | 21 | { |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 22 | diffcore_std(&diff_options); |
Linus Torvalds | 9ab55bd | 2005-05-23 16:37:47 -0700 | [diff] [blame] | 23 | if (diff_queue_is_empty()) { |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 24 | int saved_fmt = diff_options.output_format; |
| 25 | diff_options.output_format = DIFF_FORMAT_NO_OUTPUT; |
| 26 | diff_flush(&diff_options); |
| 27 | diff_options.output_format = saved_fmt; |
Linus Torvalds | 9ab55bd | 2005-05-23 16:37:47 -0700 | [diff] [blame] | 28 | return 0; |
Junio C Hamano | 6b14d7f | 2005-05-22 10:04:37 -0700 | [diff] [blame] | 29 | } |
Junio C Hamano | 6b14d7f | 2005-05-22 10:04:37 -0700 | [diff] [blame] | 30 | if (header) { |
Pavel Roskin | 601c978 | 2005-11-10 00:30:12 -0500 | [diff] [blame] | 31 | if (!no_commit_id) |
| 32 | printf("%s%c", header, diff_options.line_termination); |
Junio C Hamano | 6b14d7f | 2005-05-22 10:04:37 -0700 | [diff] [blame] | 33 | header = NULL; |
| 34 | } |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 35 | diff_flush(&diff_options); |
Junio C Hamano | 6b14d7f | 2005-05-22 10:04:37 -0700 | [diff] [blame] | 36 | return 1; |
Junio C Hamano | 38c6f78 | 2005-05-21 19:40:36 -0700 | [diff] [blame] | 37 | } |
| 38 | |
Junio C Hamano | 5c97558 | 2005-05-19 03:32:35 -0700 | [diff] [blame] | 39 | static int diff_tree_sha1_top(const unsigned char *old, |
| 40 | const unsigned char *new, const char *base) |
| 41 | { |
| 42 | int ret; |
Junio C Hamano | 57fe64a | 2005-05-19 19:00:36 -0700 | [diff] [blame] | 43 | |
Linus Torvalds | ac1b3d1 | 2005-10-20 21:05:05 -0700 | [diff] [blame] | 44 | ret = diff_tree_sha1(old, new, base, &diff_options); |
Junio C Hamano | 38c6f78 | 2005-05-21 19:40:36 -0700 | [diff] [blame] | 45 | call_diff_flush(); |
Junio C Hamano | 5c97558 | 2005-05-19 03:32:35 -0700 | [diff] [blame] | 46 | return ret; |
| 47 | } |
| 48 | |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 49 | static int diff_root_tree(const unsigned char *new, const char *base) |
| 50 | { |
| 51 | int retval; |
| 52 | void *tree; |
Linus Torvalds | ac1b3d1 | 2005-10-20 21:05:05 -0700 | [diff] [blame] | 53 | struct tree_desc empty, real; |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 54 | |
Linus Torvalds | ac1b3d1 | 2005-10-20 21:05:05 -0700 | [diff] [blame] | 55 | tree = read_object_with_reference(new, "tree", &real.size, NULL); |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 56 | if (!tree) |
| 57 | die("unable to read root tree (%s)", sha1_to_hex(new)); |
Linus Torvalds | ac1b3d1 | 2005-10-20 21:05:05 -0700 | [diff] [blame] | 58 | real.buf = tree; |
| 59 | |
| 60 | empty.buf = ""; |
| 61 | empty.size = 0; |
| 62 | retval = diff_tree(&empty, &real, base, &diff_options); |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 63 | free(tree); |
Junio C Hamano | 38c6f78 | 2005-05-21 19:40:36 -0700 | [diff] [blame] | 64 | call_diff_flush(); |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 65 | return retval; |
| 66 | } |
| 67 | |
Junio C Hamano | 47dd0d5 | 2005-12-13 17:21:41 -0800 | [diff] [blame] | 68 | static const char *generate_header(const unsigned char *commit_sha1, |
| 69 | const unsigned char *parent_sha1, |
Junio C Hamano | 3815f42 | 2006-01-27 01:54:59 -0800 | [diff] [blame] | 70 | const struct commit *commit) |
Linus Torvalds | cee99d2 | 2005-05-06 11:42:47 -0700 | [diff] [blame] | 71 | { |
Linus Torvalds | 3258c90 | 2005-05-21 11:04:19 -0700 | [diff] [blame] | 72 | static char this_header[16384]; |
Linus Torvalds | cee99d2 | 2005-05-06 11:42:47 -0700 | [diff] [blame] | 73 | int offset; |
Junio C Hamano | a50b870 | 2005-11-21 21:49:06 -0800 | [diff] [blame] | 74 | unsigned long len; |
Junio C Hamano | 47dd0d5 | 2005-12-13 17:21:41 -0800 | [diff] [blame] | 75 | int abbrev = diff_options.abbrev; |
Junio C Hamano | 3815f42 | 2006-01-27 01:54:59 -0800 | [diff] [blame] | 76 | const char *msg = commit->buffer; |
Linus Torvalds | cee99d2 | 2005-05-06 11:42:47 -0700 | [diff] [blame] | 77 | |
Linus Torvalds | 1809266 | 2005-06-23 13:56:55 -0700 | [diff] [blame] | 78 | if (!verbose_header) |
Junio C Hamano | 47dd0d5 | 2005-12-13 17:21:41 -0800 | [diff] [blame] | 79 | return sha1_to_hex(commit_sha1); |
Linus Torvalds | cee99d2 | 2005-05-06 11:42:47 -0700 | [diff] [blame] | 80 | |
Junio C Hamano | a50b870 | 2005-11-21 21:49:06 -0800 | [diff] [blame] | 81 | len = strlen(msg); |
Junio C Hamano | 47dd0d5 | 2005-12-13 17:21:41 -0800 | [diff] [blame] | 82 | |
| 83 | offset = sprintf(this_header, "%s%s ", |
| 84 | header_prefix, |
| 85 | diff_unique_abbrev(commit_sha1, abbrev)); |
Junio C Hamano | af3feef | 2006-01-24 01:22:04 -0800 | [diff] [blame] | 86 | if (commit_sha1 != parent_sha1) |
| 87 | offset += sprintf(this_header + offset, "(from %s)\n", |
| 88 | parent_sha1 |
| 89 | ? diff_unique_abbrev(parent_sha1, abbrev) |
| 90 | : "root"); |
| 91 | else |
| 92 | offset += sprintf(this_header + offset, "(from parents)\n"); |
Junio C Hamano | 3815f42 | 2006-01-27 01:54:59 -0800 | [diff] [blame] | 93 | offset += pretty_print_commit(commit_format, commit, len, |
Junio C Hamano | 47dd0d5 | 2005-12-13 17:21:41 -0800 | [diff] [blame] | 94 | this_header + offset, |
Junio C Hamano | b2d4c56 | 2006-01-25 02:37:40 -0800 | [diff] [blame] | 95 | sizeof(this_header) - offset, abbrev); |
Linus Torvalds | ec0bdb6 | 2006-02-05 11:42:09 -0800 | [diff] [blame] | 96 | if (always_show_header) { |
| 97 | puts(this_header); |
| 98 | return NULL; |
| 99 | } |
Linus Torvalds | cee99d2 | 2005-05-06 11:42:47 -0700 | [diff] [blame] | 100 | return this_header; |
| 101 | } |
| 102 | |
Junio C Hamano | 45392a6 | 2006-02-05 23:00:41 -0800 | [diff] [blame] | 103 | static int diff_tree_commit(struct commit *commit) |
Linus Torvalds | b11645b | 2005-05-18 13:06:47 -0700 | [diff] [blame] | 104 | { |
Junio C Hamano | a50b870 | 2005-11-21 21:49:06 -0800 | [diff] [blame] | 105 | struct commit_list *parents; |
Junio C Hamano | 45392a6 | 2006-02-05 23:00:41 -0800 | [diff] [blame] | 106 | unsigned const char *sha1 = commit->object.sha1; |
Linus Torvalds | b11645b | 2005-05-18 13:06:47 -0700 | [diff] [blame] | 107 | |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 108 | /* Root commit? */ |
Junio C Hamano | a50b870 | 2005-11-21 21:49:06 -0800 | [diff] [blame] | 109 | if (show_root_diff && !commit->parents) { |
Junio C Hamano | 3815f42 | 2006-01-27 01:54:59 -0800 | [diff] [blame] | 110 | header = generate_header(sha1, NULL, commit); |
Junio C Hamano | 45392a6 | 2006-02-05 23:00:41 -0800 | [diff] [blame] | 111 | diff_root_tree(sha1, ""); |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 112 | } |
| 113 | |
| 114 | /* More than one parent? */ |
Junio C Hamano | af3feef | 2006-01-24 01:22:04 -0800 | [diff] [blame] | 115 | if (commit->parents && commit->parents->next) { |
| 116 | if (ignore_merges) |
| 117 | return 0; |
| 118 | else if (combine_merges) { |
Junio C Hamano | addafaf | 2006-01-28 00:16:09 -0800 | [diff] [blame] | 119 | header = generate_header(sha1, sha1, commit); |
Linus Torvalds | ee63802 | 2006-02-09 10:30:28 -0800 | [diff] [blame] | 120 | header = diff_tree_combined_merge(sha1, header, |
| 121 | dense_combined_merges, |
| 122 | &diff_options); |
| 123 | if (!header && verbose_header) |
| 124 | header_prefix = "\ndiff-tree "; |
| 125 | return 0; |
Junio C Hamano | af3feef | 2006-01-24 01:22:04 -0800 | [diff] [blame] | 126 | } |
| 127 | } |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 128 | |
Junio C Hamano | a50b870 | 2005-11-21 21:49:06 -0800 | [diff] [blame] | 129 | for (parents = commit->parents; parents; parents = parents->next) { |
| 130 | struct commit *parent = parents->item; |
Junio C Hamano | 3815f42 | 2006-01-27 01:54:59 -0800 | [diff] [blame] | 131 | header = generate_header(sha1, parent->object.sha1, commit); |
Junio C Hamano | 45392a6 | 2006-02-05 23:00:41 -0800 | [diff] [blame] | 132 | diff_tree_sha1_top(parent->object.sha1, sha1, ""); |
Linus Torvalds | d6db010 | 2005-05-21 15:42:53 -0700 | [diff] [blame] | 133 | if (!header && verbose_header) { |
Linus Torvalds | b11645b | 2005-05-18 13:06:47 -0700 | [diff] [blame] | 134 | header_prefix = "\ndiff-tree "; |
Linus Torvalds | d6db010 | 2005-05-21 15:42:53 -0700 | [diff] [blame] | 135 | /* |
| 136 | * Don't print multiple merge entries if we |
| 137 | * don't print the diffs. |
| 138 | */ |
Linus Torvalds | d6db010 | 2005-05-21 15:42:53 -0700 | [diff] [blame] | 139 | } |
Linus Torvalds | b11645b | 2005-05-18 13:06:47 -0700 | [diff] [blame] | 140 | } |
| 141 | return 0; |
| 142 | } |
| 143 | |
Junio C Hamano | 45392a6 | 2006-02-05 23:00:41 -0800 | [diff] [blame] | 144 | static int diff_tree_commit_sha1(const unsigned char *sha1) |
| 145 | { |
| 146 | struct commit *commit = lookup_commit_reference(sha1); |
| 147 | if (!commit) |
| 148 | return -1; |
| 149 | return diff_tree_commit(commit); |
| 150 | } |
| 151 | |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 152 | static int diff_tree_stdin(char *line) |
| 153 | { |
| 154 | int len = strlen(line); |
Junio C Hamano | 45392a6 | 2006-02-05 23:00:41 -0800 | [diff] [blame] | 155 | unsigned char sha1[20]; |
| 156 | struct commit *commit; |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 157 | |
| 158 | if (!len || line[len-1] != '\n') |
| 159 | return -1; |
| 160 | line[len-1] = 0; |
Junio C Hamano | 45392a6 | 2006-02-05 23:00:41 -0800 | [diff] [blame] | 161 | if (get_sha1_hex(line, sha1)) |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 162 | return -1; |
Junio C Hamano | 45392a6 | 2006-02-05 23:00:41 -0800 | [diff] [blame] | 163 | commit = lookup_commit(sha1); |
| 164 | if (!commit || parse_commit(commit)) |
| 165 | return -1; |
| 166 | if (isspace(line[40]) && !get_sha1_hex(line+41, sha1)) { |
| 167 | /* Graft the fake parents locally to the commit */ |
| 168 | int pos = 41; |
| 169 | struct commit_list **pptr, *parents; |
| 170 | |
| 171 | /* Free the real parent list */ |
| 172 | for (parents = commit->parents; parents; ) { |
| 173 | struct commit_list *tmp = parents->next; |
| 174 | free(parents); |
| 175 | parents = tmp; |
| 176 | } |
| 177 | commit->parents = NULL; |
| 178 | pptr = &(commit->parents); |
| 179 | while (line[pos] && !get_sha1_hex(line + pos, sha1)) { |
| 180 | struct commit *parent = lookup_commit(sha1); |
| 181 | if (parent) { |
| 182 | pptr = &commit_list_insert(parent, pptr)->next; |
| 183 | } |
| 184 | pos += 41; |
| 185 | } |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 186 | } |
Junio C Hamano | a50b870 | 2005-11-21 21:49:06 -0800 | [diff] [blame] | 187 | return diff_tree_commit(commit); |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 188 | } |
| 189 | |
Petr Baudis | 4d1f119 | 2005-07-29 11:01:26 +0200 | [diff] [blame] | 190 | static const char diff_tree_usage[] = |
Junio C Hamano | d8f4790 | 2006-01-24 01:22:04 -0800 | [diff] [blame] | 191 | "git-diff-tree [--stdin] [-m] [-c] [--cc] [-s] [-v] [--pretty] [-t] [-r] [--root] " |
Chris Shoemaker | 50b8e35 | 2005-10-28 13:04:49 -0400 | [diff] [blame] | 192 | "[<common diff options>] <tree-ish> [<tree-ish>] [<path>...]\n" |
| 193 | " -r diff recursively\n" |
| 194 | " --root include the initial commit as diff against /dev/null\n" |
Junio C Hamano | dda2d79 | 2005-07-13 12:52:35 -0700 | [diff] [blame] | 195 | COMMON_DIFF_OPTIONS_HELP; |
Junio C Hamano | a8db165 | 2005-06-12 17:44:21 -0700 | [diff] [blame] | 196 | |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 197 | int main(int argc, const char **argv) |
Linus Torvalds | 73134b6 | 2005-04-10 14:03:58 -0700 | [diff] [blame] | 198 | { |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 199 | int nr_sha1; |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 200 | char line[1000]; |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 201 | unsigned char sha1[2][20]; |
Linus Torvalds | d288a70 | 2005-08-16 18:06:34 -0700 | [diff] [blame] | 202 | const char *prefix = setup_git_directory(); |
Linus Torvalds | 73134b6 | 2005-04-10 14:03:58 -0700 | [diff] [blame] | 203 | |
Junio C Hamano | 9ce392f | 2005-11-21 22:52:37 -0800 | [diff] [blame] | 204 | git_config(git_diff_config); |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 205 | nr_sha1 = 0; |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 206 | diff_setup(&diff_options); |
| 207 | |
Linus Torvalds | c5b4238 | 2005-04-23 22:08:00 -0700 | [diff] [blame] | 208 | for (;;) { |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 209 | int diff_opt_cnt; |
Junio C Hamano | 6b14d7f | 2005-05-22 10:04:37 -0700 | [diff] [blame] | 210 | const char *arg; |
Linus Torvalds | c5b4238 | 2005-04-23 22:08:00 -0700 | [diff] [blame] | 211 | |
Linus Torvalds | 73134b6 | 2005-04-10 14:03:58 -0700 | [diff] [blame] | 212 | argv++; |
| 213 | argc--; |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 214 | arg = *argv; |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 215 | if (!arg) |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 216 | break; |
| 217 | |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 218 | if (*arg != '-') { |
| 219 | if (nr_sha1 < 2 && !get_sha1(arg, sha1[nr_sha1])) { |
| 220 | nr_sha1++; |
| 221 | continue; |
| 222 | } |
| 223 | break; |
| 224 | } |
| 225 | |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 226 | diff_opt_cnt = diff_opt_parse(&diff_options, argv, argc); |
| 227 | if (diff_opt_cnt < 0) |
| 228 | usage(diff_tree_usage); |
| 229 | else if (diff_opt_cnt) { |
| 230 | argv += diff_opt_cnt - 1; |
| 231 | argc -= diff_opt_cnt - 1; |
| 232 | continue; |
| 233 | } |
| 234 | |
| 235 | |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 236 | if (!strcmp(arg, "--")) { |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 237 | argv++; |
| 238 | argc--; |
| 239 | break; |
| 240 | } |
Linus Torvalds | bf16c71 | 2005-04-11 08:37:17 -0700 | [diff] [blame] | 241 | if (!strcmp(arg, "-r")) { |
Linus Torvalds | ac1b3d1 | 2005-10-20 21:05:05 -0700 | [diff] [blame] | 242 | diff_options.recursive = 1; |
Linus Torvalds | 73134b6 | 2005-04-10 14:03:58 -0700 | [diff] [blame] | 243 | continue; |
| 244 | } |
Junio C Hamano | 4cae1a9 | 2005-05-24 23:24:22 -0700 | [diff] [blame] | 245 | if (!strcmp(arg, "-t")) { |
Linus Torvalds | ac1b3d1 | 2005-10-20 21:05:05 -0700 | [diff] [blame] | 246 | diff_options.recursive = 1; |
| 247 | diff_options.tree_in_recursive = 1; |
Junio C Hamano | 4cae1a9 | 2005-05-24 23:24:22 -0700 | [diff] [blame] | 248 | continue; |
| 249 | } |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 250 | if (!strcmp(arg, "-m")) { |
Junio C Hamano | 6932c78 | 2006-02-11 16:43:30 -0800 | [diff] [blame] | 251 | ignore_merges = 0; |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 252 | continue; |
| 253 | } |
Junio C Hamano | af3feef | 2006-01-24 01:22:04 -0800 | [diff] [blame] | 254 | if (!strcmp(arg, "-c")) { |
| 255 | combine_merges = 1; |
| 256 | continue; |
| 257 | } |
Junio C Hamano | d8f4790 | 2006-01-24 01:22:04 -0800 | [diff] [blame] | 258 | if (!strcmp(arg, "--cc")) { |
| 259 | dense_combined_merges = combine_merges = 1; |
| 260 | continue; |
| 261 | } |
Linus Torvalds | cee99d2 | 2005-05-06 11:42:47 -0700 | [diff] [blame] | 262 | if (!strcmp(arg, "-v")) { |
| 263 | verbose_header = 1; |
| 264 | header_prefix = "diff-tree "; |
| 265 | continue; |
| 266 | } |
Junio C Hamano | a8db165 | 2005-06-12 17:44:21 -0700 | [diff] [blame] | 267 | if (!strncmp(arg, "--pretty", 8)) { |
| 268 | verbose_header = 1; |
Linus Torvalds | ba88e54 | 2005-06-12 20:34:09 -0700 | [diff] [blame] | 269 | header_prefix = "diff-tree "; |
Junio C Hamano | a8db165 | 2005-06-12 17:44:21 -0700 | [diff] [blame] | 270 | commit_format = get_commit_format(arg+8); |
| 271 | continue; |
| 272 | } |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 273 | if (!strcmp(arg, "--stdin")) { |
| 274 | read_stdin = 1; |
| 275 | continue; |
| 276 | } |
Linus Torvalds | dc26bd8 | 2005-05-19 13:44:29 -0700 | [diff] [blame] | 277 | if (!strcmp(arg, "--root")) { |
| 278 | show_root_diff = 1; |
| 279 | continue; |
| 280 | } |
Pavel Roskin | 601c978 | 2005-11-10 00:30:12 -0500 | [diff] [blame] | 281 | if (!strcmp(arg, "--no-commit-id")) { |
| 282 | no_commit_id = 1; |
| 283 | continue; |
| 284 | } |
Linus Torvalds | ec0bdb6 | 2006-02-05 11:42:09 -0800 | [diff] [blame] | 285 | if (!strcmp(arg, "--always")) { |
| 286 | always_show_header = 1; |
| 287 | continue; |
| 288 | } |
Junio C Hamano | c5bac17 | 2005-04-20 19:49:16 -0700 | [diff] [blame] | 289 | usage(diff_tree_usage); |
Linus Torvalds | 73134b6 | 2005-04-10 14:03:58 -0700 | [diff] [blame] | 290 | } |
| 291 | |
Linus Torvalds | ee63802 | 2006-02-09 10:30:28 -0800 | [diff] [blame] | 292 | if (combine_merges) |
Junio C Hamano | af3feef | 2006-01-24 01:22:04 -0800 | [diff] [blame] | 293 | ignore_merges = 0; |
Linus Torvalds | ee63802 | 2006-02-09 10:30:28 -0800 | [diff] [blame] | 294 | |
| 295 | /* We can only do dense combined merges with diff output */ |
| 296 | if (dense_combined_merges) |
| 297 | diff_options.output_format = DIFF_FORMAT_PATCH; |
Junio C Hamano | af3feef | 2006-01-24 01:22:04 -0800 | [diff] [blame] | 298 | |
Linus Torvalds | deb989b | 2006-02-07 10:26:41 -0800 | [diff] [blame] | 299 | if (diff_options.output_format == DIFF_FORMAT_PATCH) |
| 300 | diff_options.recursive = 1; |
| 301 | |
Linus Torvalds | ac1b3d1 | 2005-10-20 21:05:05 -0700 | [diff] [blame] | 302 | diff_tree_setup_paths(get_pathspec(prefix, argv)); |
Junio C Hamano | 47dd0d5 | 2005-12-13 17:21:41 -0800 | [diff] [blame] | 303 | diff_setup_done(&diff_options); |
Linus Torvalds | c5b4238 | 2005-04-23 22:08:00 -0700 | [diff] [blame] | 304 | |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 305 | switch (nr_sha1) { |
| 306 | case 0: |
| 307 | if (!read_stdin) |
| 308 | usage(diff_tree_usage); |
| 309 | break; |
| 310 | case 1: |
Junio C Hamano | 45392a6 | 2006-02-05 23:00:41 -0800 | [diff] [blame] | 311 | diff_tree_commit_sha1(sha1[0]); |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 312 | break; |
| 313 | case 2: |
Junio C Hamano | 5c97558 | 2005-05-19 03:32:35 -0700 | [diff] [blame] | 314 | diff_tree_sha1_top(sha1[0], sha1[1], ""); |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 315 | break; |
| 316 | } |
| 317 | |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 318 | if (!read_stdin) |
Linus Torvalds | 0a8365a | 2005-05-18 13:10:17 -0700 | [diff] [blame] | 319 | return 0; |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 320 | |
Junio C Hamano | 6b5ee13 | 2005-09-21 00:00:47 -0700 | [diff] [blame] | 321 | if (diff_options.detect_rename) |
| 322 | diff_options.setup |= (DIFF_SETUP_USE_SIZE_CACHE | |
| 323 | DIFF_SETUP_USE_CACHE); |
Linus Torvalds | e0965d8 | 2005-05-06 10:03:17 -0700 | [diff] [blame] | 324 | while (fgets(line, sizeof(line), stdin)) |
| 325 | diff_tree_stdin(line); |
| 326 | |
| 327 | return 0; |
Linus Torvalds | 9174026 | 2005-04-09 13:00:54 -0700 | [diff] [blame] | 328 | } |