38
OPT_END()
39
};
40
struct option *options;
41
- int res = 0;
41
+ int i, dash_dash = -1, res = 0;
42
struct strbuf range1 = STRBUF_INIT, range2 = STRBUF_INIT;
43
struct object_id oid;
44
+ const char *three_dots = NULL;
45
46
git_config(git_diff_ui_config, NULL);
47
49
50
options = parse_options_concat(range_diff_options, diffopt.parseopts);
51
argc = parse_options(argc, argv, prefix, options,
51
- builtin_range_diff_usage, 0);
52
+ builtin_range_diff_usage, PARSE_OPT_KEEP_DASHDASH);
53
54
diff_setup_done(&diffopt);
55
57
if (!simple_color)
58
diffopt.use_color = 1;
59
59
- if (argc == 3) {
60
- if (get_oid_committish(argv[0], &oid))
60
+ for (i = 0; i < argc; i++)
61
+ if (!strcmp(argv[i], "--")) {
62
+ dash_dash = i;
63
+ break;
64
+ }
65
+
66
+ if (dash_dash == 3 ||
67
+ (dash_dash < 0 && argc > 2 &&
68
+ !get_oid_committish(argv[0], &oid) &&
69
+ !get_oid_committish(argv[1], &oid) &&
70
+ !get_oid_committish(argv[2], &oid))) {
71
+ if (dash_dash < 0)
72
+ ; /* already validated arguments */
73
+ else if (get_oid_committish(argv[0], &oid))
74
usage_msg_optf(_("not a revision: '%s'"),
75
builtin_range_diff_usage, options,
76
argv[0]);
85
86
strbuf_addf(&range1, "%s..%s", argv[0], argv[1]);
87
strbuf_addf(&range2, "%s..%s", argv[0], argv[2]);
75
- } else if (argc == 2) {
76
- if (!is_range_diff_range(argv[0]))
88
+
89
+ strvec_pushv(&other_arg, argv +
90
+ (dash_dash < 0 ? 3 : dash_dash));
91
+ } else if (dash_dash == 2 ||
92
+ (dash_dash < 0 && argc > 1 &&
93
+ is_range_diff_range(argv[0]) &&
94
+ is_range_diff_range(argv[1]))) {
95
+ if (dash_dash < 0)
96
+ ; /* already validated arguments */
97
+ else if (!is_range_diff_range(argv[0]))
98
usage_msg_optf(_("not a commit range: '%s'"),
99
builtin_range_diff_usage, options,
100
argv[0]);
105
106
strbuf_addstr(&range1, argv[0]);
107
strbuf_addstr(&range2, argv[1]);
87
- } else if (argc == 1) {
88
- const char *b = strstr(argv[0], "..."), *a = argv[0];
108
+
109
+ strvec_pushv(&other_arg, argv +
110
+ (dash_dash < 0 ? 2 : dash_dash));
111
+ } else if (dash_dash == 1 ||
112
+ (dash_dash < 0 && argc > 0 &&
113
+ (three_dots = strstr(argv[0], "...")))) {
114
+ const char *a, *b;
115
int a_len;
116
91
- if (!b)
117
+ if (dash_dash < 0)
118
+ ; /* already validated arguments */
119
+ else if (!(three_dots = strstr(argv[0], "...")))
120
usage_msg_optf(_("not a symmetric range: '%s'"),
93
- builtin_range_diff_usage, options,
94
- argv[0]);
121
+ builtin_range_diff_usage, options,
122
+ argv[0]);
123
96
- a_len = (int)(b - a);
97
- if (!a_len) {
124
+ if (three_dots == argv[0]) {
125
a = "HEAD";
126
a_len = strlen(a);
127
+ } else {
128
+ a = argv[0];
129
+ a_len = (int)(three_dots - a);
130
}
101
- b += 3;
102
- if (!*b)
131
+
132
+ if (three_dots[3])
133
+ b = three_dots + 3;
134
+ else
135
b = "HEAD";
136
+
137
strbuf_addf(&range1, "%s..%.*s", b, a_len, a);
138
strbuf_addf(&range2, "%.*s..%s", a_len, a, b);
139
+
140
+ strvec_pushv(&other_arg, argv +
141
+ (dash_dash < 0 ? 1 : dash_dash));
142
} else
143
usage_msg_opt(_("need two commit ranges"),
144
builtin_range_diff_usage, options);