25
25
static const char builtin_diff_usage[] =
26
26
"git-diff <options> <rev>{0,2} -- <path>*";
28
static int builtin_diff_files(struct rev_info *revs,
29
int argc, const char **argv)
33
const char *arg = argv[1];
34
if (!strcmp(arg, "--base"))
36
else if (!strcmp(arg, "--ours"))
38
else if (!strcmp(arg, "--theirs"))
40
else if (!strcmp(arg, "-q"))
43
usage(builtin_diff_usage);
47
* Make sure there are NO revision (i.e. pending object) parameter,
48
* specified rev.max_count is reasonable (0 <= n <= 3), and
49
* there is no other revision filtering parameter.
51
if (revs->pending.nr ||
52
revs->min_age != -1 ||
53
revs->max_age != -1 ||
55
usage(builtin_diff_usage);
56
if (revs->max_count < 0 &&
57
(revs->diffopt.output_format & DIFF_FORMAT_PATCH))
58
revs->combine_merges = revs->dense_combined_merges = 1;
59
return run_diff_files(revs, silent);
62
28
static void stuff_change(struct diff_options *opt,
63
29
unsigned old_mode, unsigned new_mode,
64
30
const unsigned char *old_sha1,
192
162
parent = xmalloc(ents * sizeof(*parent));
193
163
/* Again, the revs are all reverse */
194
164
for (i = 0; i < ents; i++)
195
hashcpy((unsigned char*)parent + i, ent[ents - 1 - i].item->sha1);
165
hashcpy((unsigned char *)(parent + i),
166
ent[ents - 1 - i].item->sha1);
196
167
diff_tree_combined(parent[0], parent + 1, ents - 1,
197
168
revs->dense_combined_merges, revs);
239
212
* Other cases are errors.
215
prefix = setup_git_directory_gently(&nongit);
242
216
git_config(git_diff_ui_config);
243
217
init_revisions(&rev, prefix);
245
argc = setup_revisions(argc, argv, &rev, NULL);
219
if (!setup_diff_no_index(&rev, argc, argv, nongit, prefix))
222
argc = setup_revisions(argc, argv, &rev, NULL);
246
223
if (!rev.diffopt.output_format) {
247
224
rev.diffopt.output_format = DIFF_FORMAT_PATCH;
248
225
if (diff_setup_done(&rev.diffopt) < 0)
317
return builtin_diff_files(&rev, argc, argv);
296
result = run_diff_files_cmd(&rev, argc, argv);
321
300
usage(builtin_diff_usage);
322
return builtin_diff_b_f(&rev, argc, argv, blob, path);
301
result = builtin_diff_b_f(&rev, argc, argv, blob, path);
326
305
usage(builtin_diff_usage);
327
return builtin_diff_blobs(&rev, argc, argv, blob);
306
result = builtin_diff_blobs(&rev, argc, argv, blob);
330
309
usage(builtin_diff_usage);
334
313
usage(builtin_diff_usage);
335
314
else if (ents == 1)
336
return builtin_diff_index(&rev, argc, argv);
315
result = builtin_diff_index(&rev, argc, argv);
337
316
else if (ents == 2)
338
return builtin_diff_tree(&rev, argc, argv, ent);
317
result = builtin_diff_tree(&rev, argc, argv, ent);
339
318
else if ((ents == 3) && (ent[0].item->flags & UNINTERESTING)) {
340
319
/* diff A...B where there is one sane merge base between
341
320
* A and B. We have ent[0] == merge-base, ent[1] == A,
342
321
* and ent[2] == B. Show diff between the base and B.
345
return builtin_diff_tree(&rev, argc, argv, ent);
324
result = builtin_diff_tree(&rev, argc, argv, ent);
348
return builtin_diff_combined(&rev, argc, argv,
327
result = builtin_diff_combined(&rev, argc, argv,
350
usage(builtin_diff_usage);
329
if (rev.diffopt.exit_with_status)
330
result = rev.diffopt.has_changes;