Code

Call setup_git_directory() early
[git.git] / builtin-diff.c
index cb38f445611735cff5bc9fbafb3189e6ccc6c2fd..45b27cfca3975d4661651f98e951a0357686a961 100644 (file)
@@ -227,7 +227,7 @@ int cmd_diff(int argc, const char **argv, char **envp)
        struct rev_info rev;
        struct object_array_entry ent[100];
        int ents = 0, blobs = 0, paths = 0;
-       const char *path = NULL;
+       const char *path = NULL, *prefix;
        struct blobinfo blob[2];
 
        /*
@@ -250,8 +250,9 @@ int cmd_diff(int argc, const char **argv, char **envp)
         * Other cases are errors.
         */
 
+       prefix = setup_git_directory();
        git_config(git_diff_ui_config);
-       init_revisions(&rev);
+       init_revisions(&rev, prefix);
 
        argc = setup_revisions(argc, argv, &rev, NULL);
        if (!rev.diffopt.output_format) {
@@ -346,7 +347,15 @@ int cmd_diff(int argc, const char **argv, char **envp)
                return builtin_diff_index(&rev, argc, argv);
        else if (ents == 2)
                return builtin_diff_tree(&rev, argc, argv, ent);
+       else if ((ents == 3) && (ent[0].item->flags & UNINTERESTING)) {
+               /* diff A...B where there is one sane merge base between
+                * A and B.  We have ent[0] == merge-base, ent[1] == A,
+                * and ent[2] == B.  Show diff between the base and B.
+                */
+               return builtin_diff_tree(&rev, argc, argv, ent);
+       }
        else
-               return builtin_diff_combined(&rev, argc, argv, ent, ents);
+               return builtin_diff_combined(&rev, argc, argv,
+                                            ent, ents);
        usage(builtin_diff_usage);
 }