Merge branch 'mh/shorten-unambigous-ref'
[gitweb.git] / builtin / diff.c
index da69e4a3c81174cffe4d04b5531538b7d9fc78b2..0f247d24008a4dc7ba5958e716c13f7582a820f1 100644 (file)
@@ -67,15 +67,18 @@ static void stuff_change(struct diff_options *opt,
 
 static int builtin_diff_b_f(struct rev_info *revs,
                            int argc, const char **argv,
-                           struct blobinfo *blob,
-                           const char *path)
+                           struct blobinfo *blob)
 {
        /* Blob vs file in the working tree*/
        struct stat st;
+       const char *path;
 
        if (argc > 1)
                usage(builtin_diff_usage);
 
+       GUARD_PATHSPEC(&revs->prune_data, PATHSPEC_FROMTOP | PATHSPEC_LITERAL);
+       path = revs->prune_data.items[0].match;
+
        if (lstat(path, &st))
                die_errno(_("failed to stat '%s'"), path);
        if (!(S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)))
@@ -258,7 +261,6 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
        struct rev_info rev;
        struct object_array ent = OBJECT_ARRAY_INIT;
        int blobs = 0, paths = 0;
-       const char *path = NULL;
        struct blobinfo blob[2];
        int nongit = 0, no_index = 0;
        int result = 0;
@@ -298,7 +300,9 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                        break;
        }
 
-       prefix = setup_git_directory_gently(&nongit);
+       if (!no_index)
+               prefix = setup_git_directory_gently(&nongit);
+
        /*
         * Treat git diff with at least one path outside of the
         * repo the same as if the command would have been executed
@@ -311,32 +315,32 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                        !path_inside_repo(prefix, argv[i + 1]))))
                no_index = DIFF_NO_INDEX_IMPLICIT;
 
-       gitmodules_config();
+       if (!no_index)
+               gitmodules_config();
        git_config(git_diff_ui_config, NULL);
 
        init_revisions(&rev, prefix);
 
-       if (no_index) {
-               if (argc != i + 2) {
-                       if (no_index == DIFF_NO_INDEX_IMPLICIT) {
-                               /*
-                                * There was no --no-index and there were not two
-                                * paths. It is possible that the user intended
-                                * to do an inside-repository operation.
-                                */
-                               fprintf(stderr, "Not a git repository\n");
-                               fprintf(stderr,
-                                       "To compare two paths outside a working tree:\n");
-                       }
-                       /* Give the usage message for non-repository usage and exit. */
-                       usagef("git diff %s <path> <path>",
-                              no_index == DIFF_NO_INDEX_EXPLICIT ?
-                                       "--no-index" : "[--no-index]");
-
+       if (no_index && argc != i + 2) {
+               if (no_index == DIFF_NO_INDEX_IMPLICIT) {
+                       /*
+                        * There was no --no-index and there were not two
+                        * paths. It is possible that the user intended
+                        * to do an inside-repository operation.
+                        */
+                       fprintf(stderr, "Not a git repository\n");
+                       fprintf(stderr,
+                               "To compare two paths outside a working tree:\n");
                }
+               /* Give the usage message for non-repository usage and exit. */
+               usagef("git diff %s <path> <path>",
+                      no_index == DIFF_NO_INDEX_EXPLICIT ?
+                      "--no-index" : "[--no-index]");
+
+       }
+       if (no_index)
                /* If this is a no-index diff, just run it and exit there. */
                diff_no_index(&rev, argc, argv, prefix);
-       }
 
        /* Otherwise, we are doing the usual "git" diff */
        rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
@@ -412,13 +416,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                        die(_("unhandled object '%s' given."), name);
                }
        }
-       if (rev.prune_data.nr) {
-               /* builtin_diff_b_f() */
-               GUARD_PATHSPEC(&rev.prune_data, PATHSPEC_FROMTOP | PATHSPEC_LITERAL);
-               if (!path)
-                       path = rev.prune_data.items[0].match;
+       if (rev.prune_data.nr)
                paths += rev.prune_data.nr;
-       }
 
        /*
         * Now, do the arguments look reasonable?
@@ -431,7 +430,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                case 1:
                        if (paths != 1)
                                usage(builtin_diff_usage);
-                       result = builtin_diff_b_f(&rev, argc, argv, blob, path);
+                       result = builtin_diff_b_f(&rev, argc, argv, blob);
                        break;
                case 2:
                        if (paths)